From 02b77f894b21098e6167113c1eed7289e0120970 Mon Sep 17 00:00:00 2001 From: serras Date: Mon, 27 Feb 2012 13:04:51 +0100 Subject: [PATCH] Remove external modules and copy them to 'Windows/tools' --- .gitmodules | 9 - SparkleShare/Windows/sparkleshare.ico | Bin 0 -> 36470 bytes .../tools/TextTemplating/.gitattributes | 2 + .../Windows/tools/TextTemplating/.gitignore | 11 + .../Windows/tools/TextTemplating/ChangeLog | 9 + .../Windows/tools/TextTemplating/Makefile.am | 4 + .../Mono.TextTemplating.Tests/ChangeLog | 65 + .../Mono.TextTemplating.Tests/DummyHost.cs | 113 + .../GenerationTests.cs | 171 + .../Mono.TextTemplating.Tests.csproj | 55 + .../Mono.TextTemplating.Tests/ParsingTests.cs | 191 + .../TemplateEnginePreprocessTemplateTests.cs | 246 + .../TemplatingEngineHelper.cs | 51 + .../Mono.TextTemplating/AssemblyInfo.cs | 37 + .../Mono.TextTemplating/ChangeLog | 212 + .../Mono.TextTemplating/Makefile.am | 55 + .../AssemblyCacheMonitor.cs | 43 + .../DirectiveProcessor.cs | 63 + .../DirectiveProcessorException.cs | 56 + .../EncodingHelper.cs | 40 + .../Engine.cs | 58 + .../Interfaces.cs | 84 + .../ParameterDirectiveProcessor.cs | 268 + .../RequiresProvidesDirectiveProcessor.cs | 196 + .../TextTemplatingSession.cs | 71 + .../TextTransformation.cs | 219 + .../ToStringHelper.cs | 69 + .../Mono.TextTemplating.csproj | 79 + .../Mono.TextTemplating/CompiledTemplate.cs | 113 + .../CrossAppDomainAssemblyResolver.cs | 59 + .../Mono.TextTemplating/ParsedTemplate.cs | 320 + .../Mono.TextTemplating/TemplateGenerator.cs | 373 + .../Mono.TextTemplating/TemplateSettings.cs | 75 + .../Mono.TextTemplating/TemplatingEngine.cs | 963 +++ .../Mono.TextTemplating/Tokeniser.cs | 295 + .../Windows/tools/TextTemplating/README.md | 19 + .../tools/TextTemplating/TextTemplating.sln | 26 + .../TextTransform/AssemblyInfo.cs | 39 + .../TextTemplating/TextTransform/ChangeLog | 25 + .../TextTemplating/TextTransform/Makefile.am | 35 + .../TextTemplating/TextTransform/Options.cs | 1112 +++ .../TextTransform/TextTransform.cs | 174 + .../TextTransform/TextTransform.csproj | 62 + .../Windows/tools/TextTemplating/build.cmd | 5 + .../Gettext.Cs.Tests/Gettext.Cs.Tests.csproj | 67 + .../Core/Gettext.Cs.Tests/PoParserTest.cs | 64 + .../Properties/AssemblyInfo.cs | 57 + .../Gettext.Cs.Web/Controls/AspTranslate.cs | 48 + .../Core/Gettext.Cs.Web/Gettext.Cs.Web.csproj | 60 + .../Gettext.Cs.Web/Properties/AssemblyInfo.cs | 58 + .../Core/Gettext.Cs/Gettext.Cs.csproj | 83 + .../Core/Gettext.Cs/Parser/ParserRequestor.cs | 55 + .../Core/Gettext.Cs/Parser/PoParser.cs | 149 + .../Gettext.Cs/Properties/AssemblyInfo.cs | 58 + .../Resource/DatabaseResourceManager.cs | 86 + .../Resource/DatabaseResourceReader.cs | 121 + .../Resource/DatabaseResourceSet.cs | 50 + .../Resource/FileBasedResourceManager.cs | 295 + .../Resource/GettextResourceManager.cs | 150 + .../Resource/GettextResourceReader.cs | 87 + .../Gettext.Cs/Resource/GettextResourceSet.cs | 49 + .../Core/Gettext.Cs/Templates/Strings.cs | 166 + .../Core/Gettext.Cs/Templates/Strings.tt | 196 + .../Gettext.CsUtils/Gettext.CsUtils.sln | 125 + .../Lib/Gnu.Getopt/AssemblyInfo.cs | 88 + .../Gettext.CsUtils/Lib/Gnu.Getopt/Getopt.cs | 1417 ++++ .../Lib/Gnu.Getopt/Gnu.Getopt.csproj | 122 + .../Gettext.CsUtils/Lib/Gnu.Getopt/LongOpt.cs | 239 + .../Lib/Gnu.Getopt/MessagesBundle.cs.resx | 72 + .../Lib/Gnu.Getopt/MessagesBundle.de.resx | 72 + .../Lib/Gnu.Getopt/MessagesBundle.fr.resx | 72 + .../Lib/Gnu.Getopt/MessagesBundle.hu.resx | 72 + .../Lib/Gnu.Getopt/MessagesBundle.ja.resx | 72 + .../Lib/Gnu.Getopt/MessagesBundle.nl.resx | 72 + .../Lib/Gnu.Getopt/MessagesBundle.no.resx | 72 + .../Lib/Gnu.Getopt/MessagesBundle.resx | 72 + .../Lib/Gnu.Gettext/Gnu.Gettext.csproj | 61 + .../Gnu.Gettext/Properties/AssemblyInfo.cs | 58 + .../Gettext.CsUtils/Lib/Gnu.Gettext/intl.cs | 520 ++ .../Gettext.CsUtils/Lib/Gnu.Gettext/msgfmt.cs | 142 + .../Lib/Gnu.Gettext/msgunfmt.cs | 258 + .../Gettext.Samples.Console.csproj | 92 + .../Gettext.Samples.Console/Program.cs | 76 + .../Properties/AssemblyInfo.cs | 58 + .../Resources/en/Strings.po | 3 + .../Resources/es/Strings.po | 3 + .../Resources/fr/Strings.po | 3 + .../Resources/pt/Strings.po | 3 + .../Gettext.Samples.Console/Strings.cs | 168 + .../Gettext.Samples.Console/Strings.tt | 9 + .../Templates/Strings.pot | 3 + .../scripts/Extract.bat | 30 + .../Gettext.Samples.Database/App.config | 9 + .../Gettext.Samples.Database.csproj | 81 + .../Gettext.Samples.Database/Program.cs | 77 + .../Properties/AssemblyInfo.cs | 58 + .../Gettext.Samples.Database/Strings.cs | 147 + .../Gettext.Samples.Database/Strings.tt | 10 + .../Translated/en/Strings.po | 3 + .../Translated/es/Strings.po | 3 + .../Translated/fr/Strings.po | 3 + .../Translated/pt/Strings.po | 3 + .../scripts/DBDump.bat | 39 + .../Gettext.Samples.Mvc/Content/Site.css | 317 + .../Controllers/AccountController.cs | 373 + .../Controllers/HomeController.cs | 46 + .../Samples/Gettext.Samples.Mvc/Default.aspx | 3 + .../Gettext.Samples.Mvc/Default.aspx.cs | 44 + .../Gettext.Samples.Mvc.Publish.xml | 35 + .../Gettext.Samples.Mvc.csproj | 155 + .../Gettext/AspTranslateControl.cs | 44 + .../Gettext.Samples.Mvc/Gettext/Extract.bat | 32 + .../Gettext/Po/en/Strings.po | 16 + .../Gettext/Po/es/Strings.po | 16 + .../Gettext.Samples.Mvc/Gettext/Strings.cs | 170 + .../Gettext.Samples.Mvc/Gettext/Strings.tt | 9 + .../Gettext/Templates/Strings.pot | 16 + .../Samples/Gettext.Samples.Mvc/Global.asax | 1 + .../Gettext.Samples.Mvc/Global.asax.cs | 54 + .../Gettext.Samples.Mvc/Po/en/Strings.po | 16 + .../Gettext.Samples.Mvc/Po/es/Strings.po | 16 + .../Properties/AssemblyInfo.cs | 57 + .../Scripts/MicrosoftAjax.debug.js | 6850 +++++++++++++++++ .../Scripts/MicrosoftAjax.js | 7 + .../Scripts/MicrosoftMvcAjax.debug.js | 337 + .../Scripts/MicrosoftMvcAjax.js | 23 + .../Scripts/jquery-1.3.2-vsdoc.js | 6255 +++++++++++++++ .../Scripts/jquery-1.3.2.js | 4410 +++++++++++ .../Scripts/jquery-1.3.2.min-vsdoc.js | 6255 +++++++++++++++ .../Scripts/jquery-1.3.2.min.js | 53 + .../Views/Account/ChangePassword.aspx | 42 + .../Views/Account/ChangePasswordSuccess.aspx | 12 + .../Views/Account/LogOn.aspx | 37 + .../Views/Account/Register.aspx | 47 + .../Gettext.Samples.Mvc/Views/Home/About.aspx | 12 + .../Gettext.Samples.Mvc/Views/Home/Index.aspx | 18 + .../Views/Shared/Error.aspx | 11 + .../Views/Shared/LogOnUserControl.ascx | 16 + .../Views/Shared/Site.Master | 40 + .../Gettext.Samples.Mvc/Views/Web.config | 34 + .../Samples/Gettext.Samples.Mvc/Web.config | 157 + .../Gettext.Samples.Spanish.csproj | 92 + .../Gettext.Samples.Spanish/Program.cs | 77 + .../Properties/AssemblyInfo.cs | 58 + .../Resources/en/Strings.po | 3 + .../Resources/es/Strings.po | 3 + .../Resources/fr/Strings.po | 3 + .../Resources/pt/Strings.po | 3 + .../Gettext.Samples.Spanish/Strings.cs | 168 + .../Gettext.Samples.Spanish/Strings.tt | 9 + .../Templates/Strings.pot | 3 + .../scripts/Extract.bat | 30 + .../Scripts/ExtractAspNetStrings.bat | 86 + .../Scripts/ExtractStrings.bat | 74 + .../Gettext.AspExtract/AspStringsExtractor.cs | 128 + .../Gettext.AspExtract/AspStringsParser.cs | 101 + .../Gettext.AspExtract.csproj | 73 + .../Tools/Gettext.AspExtract/Program.cs | 117 + .../Properties/AssemblyInfo.cs | 58 + .../App.config | 15 + .../DatabaseInterface.cs | 275 + .../DatabaseParserRequestor.cs | 56 + .../Gettext.DatabaseResourceGenerator.csproj | 79 + .../Program.cs | 170 + .../Properties/AssemblyInfo.cs | 58 + .../Tools/Gettext.Iconv/Gettext.Iconv.csproj | 71 + .../Tools/Gettext.Iconv/Program.cs | 102 + .../Gettext.Iconv/Properties/AssemblyInfo.cs | 58 + .../Gettext.Msgfmt/Gettext.Msgfmt.csproj | 78 + .../Tools/Gettext.Msgfmt/Program.cs | 106 + .../Gettext.Msgfmt/Properties/AssemblyInfo.cs | 58 + .../Gettext.ResourcesReplacer.csproj | 72 + .../Gettext.ResourcesReplacer/Program.cs | 86 + .../Properties/AssemblyInfo.cs | 58 + .../Gettext.ResourcesReplacer/Replacer.cs | 217 + .../tools/gettext-cs-utils/LicenseHeaders.rb | 129 + .../Windows/tools/gettext-cs-utils/Pack.bat | 46 + .../gettext-cs-utils/license.lgpl.header | 22 + .../Windows/tools}/xslt/Program.cs | 0 .../tools}/xslt/Properties/AssemblyInfo.cs | 0 .../Windows/tools}/xslt/build.cmd | 0 .../Windows/tools}/xslt/xslt.csproj | 0 .../Windows/tools}/xslt/xslt.sln | 0 tools/TextTemplating | 1 - tools/gettext-cs-utils | 1 - 185 files changed, 41427 insertions(+), 11 deletions(-) create mode 100644 SparkleShare/Windows/sparkleshare.ico create mode 100644 SparkleShare/Windows/tools/TextTemplating/.gitattributes create mode 100644 SparkleShare/Windows/tools/TextTemplating/.gitignore create mode 100644 SparkleShare/Windows/tools/TextTemplating/ChangeLog create mode 100644 SparkleShare/Windows/tools/TextTemplating/Makefile.am create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/ChangeLog create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/DummyHost.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/GenerationTests.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/Mono.TextTemplating.Tests.csproj create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/ParsingTests.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/TemplateEnginePreprocessTemplateTests.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/TemplatingEngineHelper.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/AssemblyInfo.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/ChangeLog create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Makefile.am create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/AssemblyCacheMonitor.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/DirectiveProcessor.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/DirectiveProcessorException.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/EncodingHelper.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/Engine.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/Interfaces.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/ParameterDirectiveProcessor.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/RequiresProvidesDirectiveProcessor.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/TextTemplatingSession.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/TextTransformation.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/ToStringHelper.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating.csproj create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/CompiledTemplate.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/CrossAppDomainAssemblyResolver.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/ParsedTemplate.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplateGenerator.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplateSettings.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplatingEngine.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/Tokeniser.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/README.md create mode 100644 SparkleShare/Windows/tools/TextTemplating/TextTemplating.sln create mode 100644 SparkleShare/Windows/tools/TextTemplating/TextTransform/AssemblyInfo.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/TextTransform/ChangeLog create mode 100644 SparkleShare/Windows/tools/TextTemplating/TextTransform/Makefile.am create mode 100644 SparkleShare/Windows/tools/TextTemplating/TextTransform/Options.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/TextTransform/TextTransform.cs create mode 100644 SparkleShare/Windows/tools/TextTemplating/TextTransform/TextTransform.csproj create mode 100644 SparkleShare/Windows/tools/TextTemplating/build.cmd create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Tests/Gettext.Cs.Tests.csproj create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Tests/PoParserTest.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Tests/Properties/AssemblyInfo.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Web/Controls/AspTranslate.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Web/Gettext.Cs.Web.csproj create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Web/Properties/AssemblyInfo.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Gettext.Cs.csproj create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Parser/ParserRequestor.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Parser/PoParser.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Properties/AssemblyInfo.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/DatabaseResourceManager.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/DatabaseResourceReader.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/DatabaseResourceSet.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/FileBasedResourceManager.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/GettextResourceManager.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/GettextResourceReader.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/GettextResourceSet.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Templates/Strings.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Templates/Strings.tt create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Gettext.CsUtils.sln create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/AssemblyInfo.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/Getopt.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/Gnu.Getopt.csproj create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/LongOpt.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.cs.resx create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.de.resx create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.fr.resx create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.hu.resx create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.ja.resx create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.nl.resx create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.no.resx create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.resx create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/Gnu.Gettext.csproj create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/Properties/AssemblyInfo.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/intl.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/msgfmt.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/msgunfmt.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Gettext.Samples.Console.csproj create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Program.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Properties/AssemblyInfo.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Resources/en/Strings.po create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Resources/es/Strings.po create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Resources/fr/Strings.po create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Resources/pt/Strings.po create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Strings.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Strings.tt create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Templates/Strings.pot create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/scripts/Extract.bat create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/App.config create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Gettext.Samples.Database.csproj create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Program.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Properties/AssemblyInfo.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Strings.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Strings.tt create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Translated/en/Strings.po create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Translated/es/Strings.po create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Translated/fr/Strings.po create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Translated/pt/Strings.po create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/scripts/DBDump.bat create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Content/Site.css create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Controllers/AccountController.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Controllers/HomeController.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Default.aspx create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Default.aspx.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext.Samples.Mvc.Publish.xml create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext.Samples.Mvc.csproj create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/AspTranslateControl.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Extract.bat create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Po/en/Strings.po create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Po/es/Strings.po create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Strings.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Strings.tt create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Templates/Strings.pot create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Global.asax create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Global.asax.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Po/en/Strings.po create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Po/es/Strings.po create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Properties/AssemblyInfo.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/MicrosoftAjax.debug.js create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/MicrosoftAjax.js create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/MicrosoftMvcAjax.debug.js create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/MicrosoftMvcAjax.js create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/jquery-1.3.2-vsdoc.js create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/jquery-1.3.2.js create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/jquery-1.3.2.min-vsdoc.js create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/jquery-1.3.2.min.js create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Views/Account/ChangePassword.aspx create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Views/Account/ChangePasswordSuccess.aspx create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Views/Account/LogOn.aspx create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Views/Account/Register.aspx create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Views/Home/About.aspx create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Views/Home/Index.aspx create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Views/Shared/Error.aspx create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Views/Shared/LogOnUserControl.ascx create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Views/Shared/Site.Master create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Views/Web.config create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Web.config create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Spanish/Gettext.Samples.Spanish.csproj create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Spanish/Program.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Spanish/Properties/AssemblyInfo.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Spanish/Resources/en/Strings.po create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Spanish/Resources/es/Strings.po create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Spanish/Resources/fr/Strings.po create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Spanish/Resources/pt/Strings.po create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Spanish/Strings.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Spanish/Strings.tt create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Spanish/Templates/Strings.pot create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Spanish/scripts/Extract.bat create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Scripts/ExtractAspNetStrings.bat create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Scripts/ExtractStrings.bat create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.AspExtract/AspStringsExtractor.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.AspExtract/AspStringsParser.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.AspExtract/Gettext.AspExtract.csproj create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.AspExtract/Program.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.AspExtract/Properties/AssemblyInfo.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.DatabaseResourceGenerator/App.config create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.DatabaseResourceGenerator/DatabaseInterface.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.DatabaseResourceGenerator/DatabaseParserRequestor.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.DatabaseResourceGenerator/Gettext.DatabaseResourceGenerator.csproj create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.DatabaseResourceGenerator/Program.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.DatabaseResourceGenerator/Properties/AssemblyInfo.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.Iconv/Gettext.Iconv.csproj create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.Iconv/Program.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.Iconv/Properties/AssemblyInfo.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.Msgfmt/Gettext.Msgfmt.csproj create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.Msgfmt/Program.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.Msgfmt/Properties/AssemblyInfo.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.ResourcesReplacer/Gettext.ResourcesReplacer.csproj create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.ResourcesReplacer/Program.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.ResourcesReplacer/Properties/AssemblyInfo.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Tools/Gettext.ResourcesReplacer/Replacer.cs create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/LicenseHeaders.rb create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/Pack.bat create mode 100644 SparkleShare/Windows/tools/gettext-cs-utils/license.lgpl.header rename {tools => SparkleShare/Windows/tools}/xslt/Program.cs (100%) rename {tools => SparkleShare/Windows/tools}/xslt/Properties/AssemblyInfo.cs (100%) rename {tools => SparkleShare/Windows/tools}/xslt/build.cmd (100%) rename {tools => SparkleShare/Windows/tools}/xslt/xslt.csproj (100%) rename {tools => SparkleShare/Windows/tools}/xslt/xslt.sln (100%) delete mode 160000 tools/TextTemplating delete mode 160000 tools/gettext-cs-utils diff --git a/.gitmodules b/.gitmodules index 64010a74..e69de29b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +0,0 @@ -[submodule "SmartIrc4net"] - path = SmartIrc4net - url = git://git.qnetp.net/smartirc4net.git -[submodule "tools/TextTemplating"] - path = tools/TextTemplating - url = git://github.com/wimh/TextTemplating.git -[submodule "tools/gettext-cs-utils"] - path = tools/gettext-cs-utils - url = git://github.com/wimh/gettext-cs-utils.git diff --git a/SparkleShare/Windows/sparkleshare.ico b/SparkleShare/Windows/sparkleshare.ico new file mode 100644 index 0000000000000000000000000000000000000000..2e88830e6568eb7f12948d6e80fa8a2373ce6a6b GIT binary patch literal 36470 zcmeHw2S8QF*6y66QZ0bk8+Pp25E~+5OKh=VL&dJKCb3uSiVYR)4J-DBg2WhG5|fyy zi7m#03W9=g`Z=67?_0CaK7u#@&Asox_xA((_Fh#&%a{%*#u99#@31F?E?EKR=dG zld+#0$@%%QaY#F(pPV1wBi*wpa(;enr8{HGqvZS$zc6FPqmdpofkYMwAUerKc?cx^ zQM~ta&RJxFij7NFvB=ZFfL^CftP4SciG>JIu>puPAR&_l0SE0>u>e4qy_qb8{99Gb zUjUwC9u{6?tW{n42cH63_+t2JAJlSyxQ#QKpGys!S{j zem|lIbSB&}u`8)2mWptHl)V?v$&XMb{AE|F*iF2f1zJ`jjmm`lkY*g7lM#Lg`FSBu z(AG?r3jfM0Dz+76K0;n5#En9{0OaEprDAS?Ak;nKkqI<{ew6Qrw6jqED5N`$a@}Tu zR`u+`*EjH{#F&cf^dJN^+UU`sh|^i??t&~XQiS{6`Oh*Wx~Jp zCg>*`qcYh5l<78=+K|$rPe5~7V7IA{kjEp0XCfYG7=TSL9pVz5XwPZ)&_;l1x0o-$Yw8UawB`}(n}~c8(5DA5_70@6z8HH!sADtG-7V1y zK)V2%p?=+vS2vU!bIZim0J@=#njOG+$+og=os})UVPZ8u7{9mDtZddLj8l}O zGg;BLI{a3soph`V=qtNM^?nlg%l9v9fklh|A-7yEaPGnau0sbrc33D-{ulM+_zS{^ zh5w=J*DpLA{~d0o9Dh1O|I~#KbH<I~AHPb0_>%?= z9!Ajy7wI*&%i#A3-pBtmfBf)1Bby9Df=PYS6)imb{&D>L3DR2HLRR$qv{!mo`cuz# za(uMW=W_deI*i&AZ_s%CMs;j6tjmCq_8+(G^Ktf|!Suq>p84WCLc)=7)SIln6W^qz zb?Mvk>8cJQ?l1)7KfcnEYbQr1JgnbH<*4uugZuRj$tsPQP8U8`j_<6LNH@y#oN&J` z#*rXYcB4jx&vwS|CON8GczETIu0%z@F0a#@pk$F?6x^`U&iEaKqeS6@JBH+T=te1Z zW80^<8RV!eQuT|J<7aBM+>zwa^XKv5-MV$af3<4W$fxhDlvdE$ufH7skcONVu3O&7 z%HE!yo=3E5tEp3)Fyqr+Ix3dZba)>>gPaFGJoI%Qfy($mwQDbic|pkzwY zt-~NW|0AiXsV~T7WN3EV-mYHtI?S5;^y8LILPq9Uk8lUIT4(%22NMn^kV85Umhqyc z(bUx3Bw>%u=Cnh?K7l_1lqdGS)FC%(Dt zkciy20k6|v@1ZhLqD*UoGyaYmPv9Orc=BY2NVxY&;L~T%o1;`wrXV#T^`JBU_LQH5 ztKoDmzy0>;fs|NE23ijvkm=caag*e>rfhZJx)o_-TwG#AVwAc=N_V)qGyb|?^E=l~ zG2}M6ySqC}ee&SRjwjCeCmJ{Yxv_9}?%esgXtj&3uC5m^UZh0i1hps)oU!D-{q8E< z&8y$vyovwy{i`9q!(DWJpKOmD|59S&<>bp>U6%e|xq7Xd>pD3BVI;bEv3hl9{z-o4 z^SNWk%9XEnU&Kc=L_}2l-&B38oIl%h_;7r@XzjxX6H1mWbNs}~Q^K7-b(&nY)78#Y zJA2LK=tbJ(t!~R(;IHwYf{ik58Oc+CbO-v!$%gPD~Y-g@g z`>_%d#@~OYJ!zdv&#Bw{_{Sbxx3 zgw`Ci=FGnqp|uC``d#*>iFKZ|4w2Rz(ppwpKLo6Kg0)a4*2dY=ngi>t8nFb9H3rra zHLxz}MP-2Zr!|0BAJG~KG|~Da3_N#;WBpNfDXlwFneV(u%x~Tu(1rC9;?epk0P6rh zte5?w?g8%L{Vi4l&<*Piv4+9ggVq{-5uesPV(md|tF2g5p&VL61i?QKJU^|YB0$TX zOe;&nnj#W@dA&hvDq2_2x|!A!Pp~GTwJ@zYXf076I0X6lqn@-*OGKQlSi>Y@ElTSb zT1&J+cnE;j9c2Nuo(@Br`ba}-5?Y%~O*XMM%c2~&c`8;I;0u2c)|Ry1FAMtX1FyM(a!^-Vcil)u9-yHx*590~mEd$3_5#g64>mVwRO>g#Q$*)Bk;E6mv2@L29+&VgIW?YOT~_@AmCW{u>wP z2-&x9-^tffysWt76itf5z4!p9#HsJSmEt{3iA#BL;KhLh;Kbwhr5wORe8TNrNbrJE zsgs|`@scSMguO_TyoO&fl1%q9P#}R zUwsk(KJ=C&-f|Qhw~xY4uDi7IRD62M>aTu1wQt{k`hW6d+}BdPXERqU7g6KlP8}G& z;8fhc_{5PHP9lbIr%qp#;%z%T6K*-&=50HUu0!7Ot2Z70U6i|j|Nc`cXB_dyj-!Z( zS~h&=3N=#9oV|Ka&%HC$NV0kJzW9TVcoPQ?9t$^fROIS@vFoRgo47tEapAn4u~fwJ z6`Qv>7~2Vb1`QfCapJ_meFh%uIj`4}=?fM{ja;;N&(g6{DJwsf@|#ehcZJ@)`}9Hd zQNzYenO9`W)GvxmoA&vnv17-<&7AFsSFwEg?iI>cAlJLkpwUZ)M~)oUXY`n1eFh6R zZs-LmzrLk}D=)cn;R~Y%ibN=Z+@QXWc;!l#EZLcyuZaIi&t9KU5)qfmDECOp&$oU1 z_MvdaLyIFtNzZQGLVe*V5ykIb4&rcf#T#{P>2U4a!{g!65~(OjXA#@CgA~uZqvTv& zf$MoT!g|z`(oq?R-npbB9&6pEOxkH(0iq&qqn2_!=W?w^jhdDH>(s3$TzzN0jV1b6S>IB=rOJ^jU%q1HDt=X!g$oz9 zS#5AGaPPUH^~FGOaUaysw^Zpej?{mI-0OS55#64W=>Lx*QCJbPrEp=Z&BYED`2TC? zU`r)FA2t26=TyX@hW~#B(-)HH{UZ#v9ejHgV#}G8wG-IR77F}l?I6D=9^DTR0&w!_ z`B$DF@ad#GAbo+5&4aHHdV$lBk%J#`>I}e3kbZ#p^S%WctgQk(>w4=2f(+j0Z%H)^d+8}_~TIk;;o6NCf?c?5DD63K96|I zdzq*UXovu9#Jdx(NPIcz4v4=dUYhu0;!}x7_6L7P@_yo#=YbC5aY^Su`mHvo1M%U+ zD-&-?yfX3m#G}eQGV!FuV-v4l5kNe4>`m};;9H3wCO)_9(rm#?6YovDKJl`|Yts5- z=_Q@ugMEoN1r5aS65mU_De;xG1|goDbYfnJGYvElA4>cz>DY+ZB)*pTW#Y++$0mN) zjr3T^D-v{f!8=+z5O3-W9-Da5Amm?o8uVWCh%Y9dpVEN$B^}tbCjju=;6qtOjO>bS zFvvq#B>2q{7Yr;CFf`GCF>GLi&g$5p<0{tUq=9w97zsOWV4+71ECdjoV8Hk=u<)Zf zXulj5xX*wwY+y|Q0lN*X;ckrK?JCxA<4e|ScPbltD2c&GG!?cpUPZ(qA4IvSoO`wvW6vUcs-B}?S=qa5j{ z?fz`Wym>pe_lO@Q@|)(!f7QI`X~Me7rpwkO`E&- zUmq7Y8xIt+L3%%VIz^v1ZN-}5t5>ZW(_{VWdGqma!2-wozT-y2O-q=+e)#C=^Opt> zU$SD}`~?dZtXM0h|7aGu(W82W^-UN(Zt|R=Urd=k4cX6MCA}XZ*t*f zy~980{ZW@L$h4yL-uD|~_u2qL!a5G?+@)*Dc0&8mB~*If>gv^2*REZ^?sNTyd)we* zh}x!&$g-sL{&HTR`LfyEA}GjgZrwWQ>eXx4eQw-9rry%~mKLi8&T6#>=yU;>0s{lh z<{)Hw-SIxBnu=VmTJzK&?oF0^R(3#uF)uJkO8+ViEFNe+L`*^y$;*wVyi#`d7S29F7`%^X+#xzyIM!;cmf6$?+Xe zzUc1$<(HQNi#b*v@(UTCIeYfpxx~U3lH`E@d$8aa^8LXqUm_J%`WHh96~vGx5qU=9rjkZi5@ag8*;W1bW9`ytGEfS?0--iPlB z=5w-7sJoryg_yJP&8dNTy4IRh)&qP@IKCHsPiw$~V4g;vy=Z>McdIn`j`En3%SSzi zJ;q~JIqCuHbSPVzLoqLR!Q3t8=X`TB@g%Jd=~(FAx2)5Fw=8U5ChS~t#GFg>a~S4l zntR2!h~{U|O!IRP=nW*mH#GD#=I4_%N1ItN&E>#tFrNpaK7;Tb89+P@zFXp(<@|0L zSbcoINRHP8c{IU$!I$BCcKnfBQF&b7Ld`#Ij8srCg7kGzo@CL!CLq&uUUlaja ze#tbmR-nNxO2djT)_^a-_cl6*)mW!tKFa}1HQ<{-3(|~1-_-?8F7qIt!guo|>JbE5 zm2*fQs9`R1G^{ZEg@Ma2hRhhelE(rK06YsY`yBR8;AJ|Y-HIcuG|F3i$-t(eP9)EB zp|s$8d>6cBm6zr)5AZW?2%CZT!Ju&g;%-Jg$R_E~9W(OR2)@e$Wfz}AHZeKK7xWUK z9&=LAu4t1$wB=>A(}TB?9I+_kyUidwpls%Yc)p;+7q~olE8@ZYQCH%(+-AH+UfG}@ z^hSYa0v2*R@J}vC?=|fi%6-ecP_`H0d6}%})CZ8^EnsfJvj8)gTbmgy;=GX!#`qt2 z&cOPe*5fy&WgU(hS;!G1ep5!)_OKD-+Q@katitdVs;p<`thrLqc3p0NsxerM$Ye5cOP6k4x?|_A-Fu*_TuT~RAxK)j0&a2i z>NRWEu3I0oVdL7^O`9qH3`mDQpFL+Tcz}gdqZTb*vUKS(3Li6K#E6lR<3F7+anj@| zpM3WD7t^Lqr|{RkeFpRiAA~Ra&|&zpj~q2}q_8aL)UjhH;d*`2+oz9j-@bh%i-3A0 zRH+xz{#A#tj>SVecIw=<>&KK&gX#_88U-}2Q^y~Ik<=D1TehZftxj(+=#8d4v&Cww zZRfmB-J%qZ@9pc1%*;1$v&v?_E1#3AQdh)J3l6&T)E6&b(JHr~Q{v<6;t(zteDmLb z!e@tM2m(^E^1i|f{cl5R70y)c-sea8(s#@Y;0KVuVe8w3~#=#SrN?KLl1?bWHQ7NF+J zXRPtY7p%)EgZSOhdZIJFP2#(R-%iMJBWryS-;@Lm>vTfTI^#Fk>6nhSM|d~<*1DcF zvgY_r2Oh+?=YUasHyUHEZ-n`;@jfF9h&Qqt+p#{`q-SwInb|JPX};_AtZJMd-w!>j z4yXyJgE_Vu!YXahv7VSWW_@L1>%KFwZMX8+?%QUz5c6T_Xf5+yrDf$;W6szp&HbhD zTzr`pYhyi|eBQuHt#d9w6oSVxE&CEqOt%DK%*;7_@$XQl2;xsEJ;1v9)Sg|2z*cTWXB$}B9CjhejHJv_$Jb2PR`6dLHb+5x~?oLmYUh z0}pfHNCzJ7z#|-Zqyvuvru=BCBs>_1y$O5x_)%3t$p}H+X{@vY_oApED`TB@2SfgINr zX++pRkXBAZ*tK*mk7E8|?x4ffv&kTu?r8$VOeNYDNH|5cTf7h(Fv$&1G*earGy${% zv<0*Sg!~Txl^YCb0|)}t2bA#%>rx!wIjRS>H#w5lxCC-ulqm|=E81tzxnd(OzbG1c z@kP;L$!Wz1A_Y#zb2|L#2y;LZo&m%D7>XjiIKkhELurc+EtsCt0n!}ss@U)^Ulbjl z^29AU<5axo^#`^Rza%xoRtTSexg3wJkrE{S@w*|GmQx-dCidcNABOk1*$Z zwGFZlTQPtf2Rw6u_i{Mo7&dpL1DM_6cbWPu+2;gj#S=76+NlENXFOC?p7Il`{`vQQ zzVqK&Aba7I2g>2#pE+b89OZHF*^X!R2hY-bIWEN)aVhKZT1lct>Fbz6gVS$N5a}y`$6|av$!sP{I@s@*-y&fEFwIfV)n8 zdckcOXP#%kAmwxZ3!f+hq8_rq1-JbwF9H1vw3OCPc~HK-i?srXKFKd(nO?%)QCf~Z z7VSv%NnsNGl&16&Ew8*n!yByE@@AWKyyj|Zm-qF{pO@TDR1c{?v{sBu?*94nB#&iw zR^m*-_HVTGnKEekZ!BclFMd^*Wm^igKk~>=i(C%XD}Onq7pr;uZMnSKs$A}lzLw+3 zb*ZvK%g3D1@vS$FeDWCs@3>QsxKcmJd6h&xrT&of*2-g-ev91g^Hk7}@qe;l`!`>a zstj3;eQMG7{A#ayXK|--H(z6y$1$~m7XfIN#{u=V{EYF*=cnlTncuB^-S>IC-F6j+ zoDpfH@~LhM@IFm##Z+zQ58qh$fI|k}5Pd=P%6W@&PzF7dpMZWF_zj5hL-e~Xu``dO z1=~L;`lT{#-80sG-9x`R(K+Jxi~8E>_v1(}+Cj=s`t8cUx8l-R<45jU_@b|jeBeUA(efy@v)!(svHaCzBC5x^qZl6qp?TxfS3>9 z7thF-@}{yOL*R2#O#IL!uQ`X z^LE>Gyvjm*z_Ldfz&kcD~AI!aE zYj?@48#Zf6B1%vyaTYR=5^ceH8cFufYb5#d{fkSIe|^0AXHYDdvQwgaJ!XCj!jz zIRxzQ9l~5 z)b^r2R0jZLa!ycyei~D?mt`bXT4QA%y9?4ExFK5^yb1cVjTwFoHfk)st8~27O0C@& zb9R0xxg2u}fa>G}@Ib#*j?U#XFgM2kYT-jq8hII{@j*Sk@V%lsQr|(2$ZM|C@{uPD zJn=URf0AqC3BQwNl;|2##$6{>aWU7sO@_Amg{&K%rjNj>UbdHOu=vWEas;BSvG#@nHl|tzD9k;7)AP` zs4w-Mv;Sy(F4S1P(H_m#y-lhYXJh3K6{J4^^f!xn%L3Pe{#cErQjDHgSg*5J!2B#j zd6Z934p3n&%0WM@yphLG;y2s-kcM~It>%3XYxtm}S{|ODztda!%4oNKg+@9+!wqwrm5 zyhSJa*BAXnP?Gu(^g>@L>Q#KH)>;#xgV^;V(%w`eUj zw&*$J?RMyFd5t(duMU8`omT@r(980w;J>P(j+Hj(dAofE-uJkX55U+TeipnTT6n>TJjSuuX6G2d=$M z&ue4c`foGvTEGNUubQYML8XltYp4hG(Y!LCChEEHY97D!+RA5tW#X&9&ErP1op1ah zkJmvvx5T%(&oLwKhdO@*+FS27@M=g`0pqOVdYuz!+|qa@40}B*?D~kWN@^8vVNE~a z|7&3UR9g)l?=sN8U2AE$$H?pN(%b8y@9P5U?L-^xG5{NS-5q)^>bD(r0@U4M5YKhs zuY)?)L460GG4gNmojL%1;w#LVnK~PfIBn$6o$y+K#>lS)=x&O6vtDPdf%m~XK>xlx);zIb``3zjr>utduLSxV?b2DA>@)I!c!ND)uYt?Z2>wQU zz%vq{>;?p=6V*!qXrg)&1RpT)ga;OW^#y(x_)S~|-xh@QbshaF_apTmjn$eoPEil& zhcH%kV!S%XEyirsSiRLB@!IZCC$&8YTZgX-(qA_=M_D^23;LD}zozjzON&D$9(d4b z2XN@Ac=P>6-fX|Y0pvIGrWp54;w5OD4>#Vc=Ye=X8)N7<@H#mLJ74-u9&d#DQoUgp z;jCvp>N^=6b;G!&u`9+bjoVsOzb$%eUG#68o$93E!xq-*YC-w~w&p16W6xRbwV735 zhiYyE9=P=pqpi&mfqCl$U z@64?9@oA&2`voiScHUz9IMK`{u+XyviSPX%p9614;xVIyw^5dDb$q<(CUaZ6*isWeutG-d;LsgpuZSXjTi1?iu50rso0 zFBFrHXDB=GOi%88IE(i_{KnGzU?#q;`60vk+y~(jWbjW8yyoFY-th1XdA#G9JPw^O z?{db(p%><`t8fDBN>M)(>L=BS>P7tvJ0|q2N$OMTzkK7irKp#|N;q(jCMoo^g+)9p zNdMIHu$@`>Sm{0Qcji6g{+g0=9`KU0?wU)^xXpcM{LD)Ne5OmdBry4XrvJp9{%NIEEp z%w(bQ+9FF4e&(>Lk_6h<obQ@sV^h=Z1>{#G3aYjtS6MYChgDyfwYK^u zmAz(cuDSZgcf7{N9D9vTIb6WT99~_(I|t799P^e}U;CPuU-XEFZcF8;gRRTCJkkEt z2h{GJF}6AZccgLU0MJJ?^3Z&^J^4@Pao8^lXm`S72|-xfL)y!olI?8B^MdjdqQB<> zmGYAVIjrZN>>fe8wV1zj<_0^o_J%uk9AJl^*WZrt?K)n6hYsH&o$wR(->T(xwrcGD zn{({7H)f(Q9@{$YPUE9f3_S9p5n$lMk_n6g4+S2A=b=dk9&rHxJS52o47gzAgAg_t zKzPu32@eGBcU%?SA9hpWU*`Qy`$s2bu{oF3Z0yNgHt0ldbSUQd!2JeG%L4{`3(Nxm zdk`>e(0Ow}GkmiMnqpoHz&swXM{jSmi|VH`H{AM$hirWO)u0ovnvFV>(c;rHIf0*^ zc?ZY|9Dn*kk*-g5~y(%Z4Mi4tq&Qj z_+Hss9yHnl_v_90{_&psv#t#}nBf_D^`k1@Gv23et{9c*}b4%3$GZ9<#0cUlpL89!4B_$HpJYWh=fhvd=GQ6jPH_ zY;vM1w%<7u$DVHiA7Ko3bwC$j*wOPa%!M5=2f~h?cY=SwarO6OFRMK#p4YIsR}9J# z3F(T+Q@P4v0D({DD2JWQRSpHncqqc?dB_O~B7h0#IpTPZatPjmMCX`^IF|c2^i#m+ ziE6g+D=jDX%sQnHEiT5)#^_#>K{!?F+3zZ{-XZ3amf;lNz(r|I!XU%^acIH zkr(ujB2TMN4Bh+IdmwC3=Y6eLe4eCcBagiP!?ONefkgl6s~YzC(M)F%YEtO`iF+r< z8Dz&~pkXsF>DbJR>OV>K?|HrQ8urA%QHKRUHur*PYyTB&EG{t?2Iz8`v5tTa2n)L+ zg&}T(m<+{7@$VEL?ayJezmoDm@L%q)7Wk_L{!J|aK@6O*-TJ36_CJVoQ~p!1u&jnD z?!Wh(7(da=A>{@7>(7673n-L>zfu$$^rZt*6v}}Y;lHRT3@9`(8Ia_F3wQ_rfFy-- zzy%Rjc#!l?Jc}?XywE_z%@>dIpl1>_;A9lfE&gq~evR_cvf(-_SYGFVT z>`^P?D`6M-oq#YG9{^zrFXg~6^l?7R?+E7yM?NCoa>$#?f>C547I};K!9rbfxWea) zhcbx@pH6eg7N;lzDgs)8#4tc-Kvz`hBY=#_4`6?QzticS2bm z5SQ$iN{!;&-FNz9nRhMZ-l)Ipx14*F2#??3HTf5{*Q7gY?@70HGI)`H@@<_DzN7HdQG{jDKY-LHy-Wh4(O@PbMcw_3)y9fKKEIYTcpXi zHdb<0YGUz4dg$&9cCW<-E`c6c0v|`1xAUC=IxY#kkWPx1FU;}IXNjCw{&y7Lkrueb zBBQ-H>5@j@7*`s${+?4FIgMt$S97K3Ts%cA1@HD>C6hgmUylR%GHs>R;i?t+OjCtb|>E z)axUphesY}VMFqP{flhFAZ#U|Z=z?iw~*~IWE%=+JjZ*oOOV3|%k~fCC))zDDJZr; zYj&Icj=N60AK^OnF>{^tp1z9fxUv%HtG*=Ts3X3G(o)%EqatC4jSIqL8xYd*lm3y? z$hJ51t`u})Wub2(o0dSx*K0u6A?koU3Cro_dP!w!EuM38xZC81gWW%S!rZ6)Msta9 zRo2@TRim*#V#OOlANt2aY4X>Z@|4?${D=d48Z{qtN{jMg_W_+F)rI0v+93%#o&p<$ z4L6KD47vx>+lxMN&?x6E$4C2F+~?$Q*U692eovX}6!H5N^wrwLmHz7utnr#GK_6@f zEYvo_mIGx`c^?AVFzo&*k8kg)XWFJ#+AWx+l|(C0Dbw+N5Vo-vQ9zdPHn#s<5x_FBE5kK#kOZ;|XbBs&dC zk1;9QjK(KD6D^y+H$%6p=PjUr*bUv*7Z-GV5H){{Xt*Tb=gO$e4cBm!JJCqWs*KtlXUEPWt@gY|8o@4XpWwoTJ{P+h2gXpdE#NoAM<(QE%D) zf-u<^_@U1del_#zu+?ERRh;ZDDgekv>C@AC{(ZU?x<5Tv;GJw^LArj~)QgXlf&m;U6zG77tyl~Q2ce6#=U=!%un0u7;xzO!eggt^oPft2*0-?XA@dH1b zjo;zoT)q{yADyAwQJ}v)K^NH_lm(5{zYnvmu;IU!z?XWy3A_{l=<}R)lV|%xay5>QXj zJhAX`=Y(F6_d?r{-9RAhs>(tCTorWnOVIOKklk+j&cv_4*5MxLyN%!UC(yA_9}pBL zI}ZV9cZ?(VDA+H+#v(K>Ga__z77LDjNdHK> zRiR&X*a8skWaB_K0D;iowu1b)9c0O0z=rMDw^lwDHX<`FnfN<{jW4;D$4A00U^#UC ztDy&tgwCNkbeVFWkUfW__s6#oG?$9jS!!+2^3L0{BRcQQVPV_fy{GRm+E46RR39Zh zF?8V;p+C*12QQ#IMIEYvcCuZ-nLE67yq+ha&$r{ZeExSce}r};+G{{Z+y-*+P{_wy z;<*;$SAxEtY&HnUUkQCe81!2FH)(mt9XSylcjdCs9XU?=f{xpiP4=5uy=|JK*vrVF z^M)?pq4OpT{iv+-7CL>@f%K&^G=x5W!;fbEHFWmRU=Okv-x8q@Mm_uibO|C zzfHPr(rY`xp${E)-Xv@}Xe^F^trqt4i#m~Af~4z}>=VdFLD*h^W*SSfE*tuKOGETm zyB(^CkX>rlHXnVRlWa=pYFJ>r=7^-J_E^CUgCq{}A#H9;u! zYzr~Y7Qi+r7&=3oT_8Z#)eCzBxlbJZL3(T1_5kC_(s-Aiw?_N51%0jZ(bx4$uIO+E z=OY}}o$7Gf%-f&JGlxLm7XqDT$O+On!FCpY(o^Fs1p#fL*Cc(sth*&Wb|=_@b%v~; zbh@OsB_RDK>El}*gpLON;nYpTmO}0ep_9g#BArbT=xYi3g7VSV_l#EA=adHL#^$W* zk9iF`Bg=q9!UaL-l;kkH9{`*6y09UT z^sv+ymev?QI4gH>;2zMoOYK~L_(r`{mRa%&XK}m;uCOBAR$;{}YlY=6!SlZ4gv&2` z0lwsgg!4T^_ssnk{%Y@aG{@fag2fIRt)Ni==(Ex@Vdz_}og4t&u@yQ@CxBin=~KH~lXHE<*_`X6lJ(a|CF!q^1Rg>7 zg8usO3p(Ma=izvcbilClx@*HO=&wbb)n4edH@n)$(C3cD`B}0XiF3Hd;q2IfiP!^v zMpdTwQSH5Um``xtgc$&xqR|R{qOH|I1N4ao8_smGwb*a8L0<~{4_#j1UKQ^WpSG$; zd>V^5l+OCD`H@Yz%h{A)IGg+{XA|I`aGSI7cYqx*9?xS5e&%e+4t>7gnoKX!=MLbi>?`zvr{x|+WFkdqt9!T$6Yks#`(Or zp%1)+{2k^-BX}a@IGUvtBPb3xCMjMGI$Nr)k)V#B8=A zMa?Fh%=%Z7^f!6U`5I>soO#D4o>M8R%z3OJ4ds6Y{lDX^-rCnnR`<5ZXCCz9f4RR} z;Gby$$aRH=`ya)r$ehj<_f%X#r)# zWdL5($co%(u*A_$5|$9amK5S4rkxhLvv_#;Sz&Q&bA>uc*{^0ISq?Ag}}4 z0Jj;4vqc4vKR-~o{JsE|(hOjggTobm9s00xfi3ZyE-_|ZN@0|*C_Uph*J_vbiV}Uc zb@Tq>H?#MQ=dg8r%6(=$<&Y%`Onx~`U2UvRIj z53k;6&JRk@;g^)9XFhW+J>vx{J^fJ^oPPs(pUzTjq0UwmK=_{loH1r2_@lHqd(7&& zP;Yae^G;Q`&*8F#hFxVY!!9YREJ!Wl7xju&U69%y=j7P2@5%~Uu$|<=0w7b$k7fBa zVJQyw8)3f}$)V}F1mtCMcnR7wNnyZ{zhZx}mb=b;lT&2Sd2g2y*O*J>SFG;RS1xsz zr?UpjUbOec{zJ&aZIpLO$c6|={x9naNMh}=4&!oi`8kNr59r#n^b?Nu0xjnQ=TM$ zjy$I0vr-^Wh=yFyAye%N`^TTs%p7OLLFTU$H0RfqP+GK)*kA2F3*`^FCUYD4 z4QshB!=+8k8`du7b!Zus4;i(M#sQTj$>871zA0?mk9mA7)*De*!Q1ZE@X?T?e?$9o zAoINsSyC75x1jy8B0b_0CLsM1?aB0z; znzRR9$ky{?Ase5j;xk~2+3z4^Zjj|3fV}18eKYR~InnkXOnf_NBYg+SA=w z6IvazJIH%&B=eQzjMx(fe{s+-|FVg%hdwEIrF5Sy^T4cI4hB4 za5f=(gA9)L&Cnhof{KtiV_yuf4S8aH$mkAZpDxZ&;|HOKx%}M9TSG<`i9Q$w*)7iF zY!ojmnM$$JNYB*6`S)l#su1_9_VU>ctoSL=ZxA@+Nb2VQE#LD zXN|UKbBFB7@aeNVi?xV(qiDEIRixo|HLJfx)t+RU*au;wy%0^|m-cu#M{cs=Uhe0MlbP#TU3b{e zLmp+rS={y>*niR!(Br%rfW3Lxo6;S7PrA~+6UfFwg$=SK>mxazEOVtjCPKys`bfS? zvdLxu&}E~2Ud{LFa|73B_yopfu?FkkDyG9`w#I_rSk-C277yHz`nu(&=XRVOZUgX^ z4v_p$d5f6Gyxo>(yeGyO+4c)Nf08!=I*}X?@($V$(*d$blI6+!M8uvSsa<)?gZdoE z!@L8qf2c0@kj{WiqWEW!E3`^fmR|DmNtwmZ?PV4{wE^s<7d_>rqa?sHFBA2I`_8#< z58UvK_qkxQJ7jbgU<>4l0y>^HS|InbK&EKHJ_7-e(^(+%h3wa4K_BN-S()MEzcCxX zxwnc*7u2l!(sbs%@r9zn7S(S!vy}U9QCqM-09a$My+woZ?10T`do9T8aE80R<>nW> zKjg5zv4^HN^d~sOoqqz1dkT2Zb4K370o~D7-AQJL-=>h+oiynC#lI=ubypVd_mX55 z{ZAPc{Z8r`?67;aKcKhLK7bbc3})E=TbsultW62_LZ-FHV8z*s=K4F-wniIYnLpW` zI(6vb^g$zzWegslq#ZQQ0b?&{2gxwzymrv&^O`|p&T9saLHMv!s&+?yQnN*;-?I9f zr1C58hpIVQqZkEQ(U3Fh0X6i@TAcq=pM$NwbRmIjNXR(^t!$+>>o;;F6vZGql`s+Bqzu(aFS~f08U!>8N zH-)BNvlRODqOLG#C_Fw{0^BWEm|$#@6AI0~W~4KKl=pGJ!lLUsQMUXi6lW?AO);~< z*Nn=z2X;322hO?zI^X213!npJI>FaD>+vnx>T44lc*zL!G@LzrSTASs-^Tq@aG%+C zR?0^?@G@64{E@Q;-*ZI+lwapNuBdtq@~;%EYskRsvW4|dw*0rt{7=t7$XD|Hfjpu_ zDnt|iV)zHoIrn4aBHac0Kl;aQ!hN|sh3Dtbl~CFZ;l`9m(@ z&O(uYX^yjeRX>vr3v5|z(i#x!FFcc7)+bosb>4&Z2-b$Bu|8Xja;Ad^z}fGPb7dr( z9N3syX#MBAAWP(5l=2^n{JU^Em;PtTMo43$brk_@P`J=xUXCr?-gYBw2WL-*$J0 zHlRJiu}*4-{gIUrUK8tsA<#j63Hyp)u$F0!cEcI^!ZrqHf>`KW5S*ib&ki`MiEpojvdW;W z?%+dk|A3G=^aHQi2=9Yo_dqr-!UhC!fN>^?jyK+{Iam$$W3}T9?vbf>s?maH5iuAvxW*y?Q&UQYS#c_Xx1;9HypyR$byz7x1 z>>D=Ier-Fz2AcpoYys@BVX%WPJJtwxtPkw4T`;#eg!2;Ob^BYvz69U~9lA&9sF!pG z{|21FZ^aq>W}Lxq2XOc~&f>S@EPjr&_-#0gAG|;Kf9$)K_g9myS?KYBvG-WmSm11c zW9@NY1;D*+yw*KvkCyHS_yYF>&|X{*JARTuF zq~q?5blevJFs9?afOOm!@B;U6q~p$jW#V42vqrZCDJnMbv|c&zl-33J6CA?*1RVDh zaNJKo`eLzOqxBH({7C&MKBIp318+SBA58OHcmB2e`tup?F&8r3W0GFGuS?8ur?Bnk zU%AKZxX)G|e9q?VO=YXDXxNNPdPaLBr(V<)#+_)Ja4*6o+>7uf?nStS`$oRR-3VuU z#lQ3Kb6kTvr;KdCzE>>vR4R)-`GUore#zp_NdC>IpNq4O!@$oy-uEqAxaA@HEK$Yg zVh`Y!>nb)C`}^lU=PcwrXYG?PrhtRaan|um&Q?PI*(cem2tQ|HpFpqu&$z{3>)7d} z7i{$n!TS~pI+~|!anhy?JYiD?9J4Azjv5OE?aWbp3LY2w;D09Te|uc8XyUwW!l}?4 zU19&ubNc;6eL`rp@Go{gb6&F&;8(yOFz-1T{}7azoyj~$e#J^mf6hvL@q~Hy+0ztf z#?Ql<@e6QfyaP@FOMvs^^ZD_9$eB4sd&Jf*G4;N6GIxP-K0U|z z^c?5YbDU2v{L(uWC;MTXQ{UfX=4)1ZQ7)ZdY+0GoAtVT z(b+h22Y066tp7=LMweu#Og6tbFAd)pob@lxwZmEeLOx69^pQO;&idzN7ryD?gS$|w z$B6p{CgHp-A)CYf0vz`XaNIAzalZh^{Q?~K3vk>o0C_8H%JI#`{Q}%SI=e@e6*;)i z4fmRC)=Z-LpX?NIrvb;E1{`-92zeZxPlY=TaCQ=8kkVO5!nU({oT^9tjgT|Ni~AEM z;|?BLmI}|wXP;j1+LuCbS*Ys$N`&2sOeg@pvFdp|c zz_vsu0CzSBn=jni0J{^&cu4Le?9w1RbI7Bb@7DHcwg-3n;I8YMt6p}&JrOu-F_q(< z2#$LqU}ye<xMfkAWveUNA%*ZzR!|S{s}9a4Z9q= z1F3m}nFSm&vlfR + + * Makefile.am: + * TextTransform: + * Mono.TextTemplating: + * Mono.TextTemplating.Tests: + * MonoDevelop.TextTemplating: Include the ASP.NET MVC and + TextTemplating addins in the main solution and build. + diff --git a/SparkleShare/Windows/tools/TextTemplating/Makefile.am b/SparkleShare/Windows/tools/TextTemplating/Makefile.am new file mode 100644 index 00000000..f0cb7546 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Makefile.am @@ -0,0 +1,4 @@ +SUBDIRS = \ + Mono.TextTemplating \ + TextTransform \ + MonoDevelop.TextTemplating diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/ChangeLog b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/ChangeLog new file mode 100644 index 00000000..061fc503 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/ChangeLog @@ -0,0 +1,65 @@ +2009-12-11 Michael Hutchinson + + * Mono.TextTemplating.Tests.csproj: Don't local-copy nunit. + +2009-11-27 Olivier Dagenais + + * GenerationTests.cs: Make tests independent of the runtime + they are running under by stripping the "autogenerated" + comment (i.e. the first 9 lines). + +2009-10-29 Lluis Sanchez Gual + + * Mono.TextTemplating.Tests.csproj: Flush. + +2009-08-13 Lluis Sanchez Gual + + * DummyHost.cs: Fix windows build. + +2009-08-13 Michael Hutchinson + + * Mono.TextTemplating.Tests.csproj: Use assembly refs for + nunit. + +2009-08-12 Michael Hutchinson + + * Mono.TextTemplating.Tests.csproj: Include the ASP.NET MVC + and TextTemplating addins in the main solution and build. + +2009-04-13 Michael Hutchinson + + * GenerationTests.cs: Add tests for Windows/Mac newlines. + +2009-04-03 Michael Hutchinson + + * Mono.TextTemplating.Tests.csproj: Updated. + + * GenerationTests.cs: Add test for C# output. + + * ParsingTests.cs: Track dummy host name change. + + * DummyHost.cs: Add more functionality to dummy host. + +2009-03-13 Michael Hutchinson + + * Mono.TextTemplating.Tests.csproj: Move output dir from + ../bin to ../build. + +2009-03-13 Michael Hutchinson + + * Mono.TextTemplating.Tests.csproj: Fix output directory. + +2009-03-12 Michael Hutchinson + + * Mono.TextTemplating.Tests.csproj: Updated. + + * ParsingTests.cs: Add parser test. + + * DummyHost.cs: Dummy templating host. + +2009-03-12 Michael Hutchinson + + * Mono.TextTemplating.Tests.csproj: Add tests. + + * ParsingTests.cs: Tokeniser state/value/location test. + diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/DummyHost.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/DummyHost.cs new file mode 100644 index 00000000..027a2ddc --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/DummyHost.cs @@ -0,0 +1,113 @@ +// +// IncludeFileProviderHost.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2009 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. + +using System; +using System.Collections.Generic; +using System.CodeDom.Compiler; +using Microsoft.VisualStudio.TextTemplating; + +namespace Mono.TextTemplating.Tests +{ + + public class DummyHost : ITextTemplatingEngineHost + { + public readonly Dictionary Locations = new Dictionary (); + public readonly Dictionary Contents = new Dictionary (); + public readonly Dictionary HostOptions = new Dictionary (); + List standardAssemblyReferences = new List (); + List standardImports = new List (); + public readonly CompilerErrorCollection Errors = new CompilerErrorCollection (); + public readonly Dictionary DirectiveProcessors = new Dictionary (); + + public virtual object GetHostOption (string optionName) + { + object o; + HostOptions.TryGetValue (optionName, out o); + return o; + } + + public virtual bool LoadIncludeText (string requestFileName, out string content, out string location) + { + content = null; + return Locations.TryGetValue (requestFileName, out location) + && Contents.TryGetValue (requestFileName, out content); + } + + public virtual void LogErrors (CompilerErrorCollection errors) + { + Errors.AddRange (errors); + } + + public virtual AppDomain ProvideTemplatingAppDomain (string content) + { + return null; + } + + public virtual string ResolveAssemblyReference (string assemblyReference) + { + throw new System.NotImplementedException(); + } + + public virtual Type ResolveDirectiveProcessor (string processorName) + { + Type t; + DirectiveProcessors.TryGetValue (processorName, out t); + return t; + } + + public virtual string ResolveParameterValue (string directiveId, string processorName, string parameterName) + { + throw new System.NotImplementedException(); + } + + public virtual string ResolvePath (string path) + { + throw new System.NotImplementedException(); + } + + public virtual void SetFileExtension (string extension) + { + throw new System.NotImplementedException(); + } + + public virtual void SetOutputEncoding (System.Text.Encoding encoding, bool fromOutputDirective) + { + throw new System.NotImplementedException(); + } + + public virtual IList StandardAssemblyReferences { + get { return standardAssemblyReferences; } + } + + public virtual IList StandardImports { + get { return standardImports; } + } + + public virtual string TemplateFile { + get; set; + } + } +} diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/GenerationTests.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/GenerationTests.cs new file mode 100644 index 00000000..1a4bd2b4 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/GenerationTests.cs @@ -0,0 +1,171 @@ +// +// GenerationTests.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2009 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. + +using System; +using System.Collections.Generic; +using System.IO; +using NUnit.Framework; +using Microsoft.VisualStudio.TextTemplating; + +namespace Mono.TextTemplating.Tests +{ + + + [TestFixture] + public class GenerationTests + { + [Test] + public void Generate () + { + string Input = ParsingTests.ParseSample1; + string Output = OutputSample1; + Generate (Input, Output, "\n"); + } + + [Test] + public void GenerateMacNewlines () + { + string MacInput = ParsingTests.ParseSample1.Replace ("\n", "\r"); + string MacOutput = OutputSample1.Replace ("\\n", "\\r").Replace ("\n", "\r");; + Generate (MacInput, MacOutput, "\r"); + } + + [Test] + public void GenerateWindowsNewlines () + { + string WinInput = ParsingTests.ParseSample1.Replace ("\n", "\r\n"); + string WinOutput = OutputSample1.Replace ("\\n", "\\r\\n").Replace ("\n", "\r\n"); + Generate (WinInput, WinOutput, "\r\n"); + } + + //NOTE: we set the newline property on the code generator so that the whole files has matching newlines, + // in order to match the newlines in the verbatim code blocks + void Generate (string input, string expectedOutput, string newline) + { + DummyHost host = new DummyHost (); + string className = "GeneratedTextTransformation4f504ca0"; + string code = GenerateCode (host, input, className, newline); + Assert.AreEqual (0, host.Errors.Count); + Assert.AreEqual (expectedOutput, TemplatingEngineHelper.StripHeader (code, newline)); + } + + #region Helpers + + string GenerateCode (ITextTemplatingEngineHost host, string content, string name, string generatorNewline) + { + ParsedTemplate pt = ParsedTemplate.FromText (content, host); + if (pt.Errors.HasErrors) { + host.LogErrors (pt.Errors); + return null; + } + + TemplateSettings settings = TemplatingEngine.GetSettings (host, pt); + if (name != null) + settings.Name = name; + if (pt.Errors.HasErrors) { + host.LogErrors (pt.Errors); + return null; + } + + var ccu = TemplatingEngine.GenerateCompileUnit (host, content, pt, settings); + if (pt.Errors.HasErrors) { + host.LogErrors (pt.Errors); + return null; + } + + var opts = new System.CodeDom.Compiler.CodeGeneratorOptions (); + using (var writer = new System.IO.StringWriter ()) { + writer.NewLine = generatorNewline; + settings.Provider.GenerateCodeFromCompileUnit (ccu, writer, opts); + return writer.ToString (); + } + } + + #endregion + + #region Expected output strings + + public static string OutputSample1 = +@" +namespace Microsoft.VisualStudio.TextTemplating { + + + public partial class GeneratedTextTransformation4f504ca0 : global::Microsoft.VisualStudio.TextTemplating.TextTransformation { + + + #line 9 """" + +baz \#> + + #line default + #line hidden + + public override string TransformText() { + this.GenerationEnvironment = null; + + #line 2 """" + this.Write(""Line One\nLine Two\n""); + + #line default + #line hidden + + #line 4 """" + +foo + + + #line default + #line hidden + + #line 7 """" + this.Write(""Line Three ""); + + #line default + #line hidden + + #line 7 """" + this.Write(global::Microsoft.VisualStudio.TextTemplating.ToStringHelper.ToStringWithCulture( bar )); + + #line default + #line hidden + + #line 7 """" + this.Write(""\nLine Four\n""); + + #line default + #line hidden + return this.GenerationEnvironment.ToString(); + } + + protected override void Initialize() { + base.Initialize(); + } + } +} +"; + #endregion + } +} diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/Mono.TextTemplating.Tests.csproj b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/Mono.TextTemplating.Tests.csproj new file mode 100644 index 00000000..75860807 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/Mono.TextTemplating.Tests.csproj @@ -0,0 +1,55 @@ + + + + Debug + AnyCPU + 9.0.21022 + 2.0 + {CB590106-8331-4CBE-8131-B154E7BF79E1} + Library + Mono.TextTemplating.Tests + Mono.TextTemplating.Tests + + + true + full + false + ..\bin + DEBUG + prompt + 4 + + + none + false + ..\bin + prompt + 4 + + + + + ..\NUnit\lib\nunit.core.dll + False + + + ..\NUnit\lib\nunit.framework.dll + False + + + + + + + + + + + + {A2364D6A-00EF-417C-80A6-815726C70032} + Mono.TextTemplating + False + + + + diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/ParsingTests.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/ParsingTests.cs new file mode 100644 index 00000000..5e247509 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/ParsingTests.cs @@ -0,0 +1,191 @@ +// +// Test.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2009 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. + +using System; +using System.Collections.Generic; +using NUnit.Framework; + +namespace Mono.TextTemplating.Tests +{ + + + [TestFixture] + public class ParsingTests + { + public static string ParseSample1 = +@"<#@ template language=""C#v3.5"" #> +Line One +Line Two +<# +foo +#> +Line Three <#= bar #> +Line Four +<#+ +baz \#> +#> +"; + + [Test] + public void TokenTest () + { + string tf = "test.input"; + Tokeniser tk = new Tokeniser (tf, ParseSample1); + + //line 1 + Assert.IsTrue (tk.Advance ()); + Assert.AreEqual (new Location (tf, 1, 1), tk.Location); + Assert.AreEqual (State.Content, tk.State); + Assert.AreEqual ("", tk.Value); + Assert.IsTrue (tk.Advance ()); + Assert.AreEqual (State.Directive, tk.State); + Assert.IsTrue (tk.Advance ()); + Assert.AreEqual (new Location (tf, 1, 5), tk.Location); + Assert.AreEqual (State.DirectiveName, tk.State); + Assert.AreEqual ("template", tk.Value); + Assert.IsTrue (tk.Advance ()); + Assert.AreEqual (State.Directive, tk.State); + Assert.IsTrue (tk.Advance ()); + Assert.AreEqual (new Location (tf, 1, 14), tk.Location); + Assert.AreEqual (State.DirectiveName, tk.State); + Assert.AreEqual ("language", tk.Value); + Assert.IsTrue (tk.Advance ()); + Assert.AreEqual (State.Directive, tk.State); + Assert.IsTrue (tk.Advance ()); + Assert.AreEqual (State.DirectiveValue, tk.State); + Assert.AreEqual (new Location (tf, 1, 23), tk.Location); + Assert.AreEqual ("C#v3.5", tk.Value); + Assert.IsTrue (tk.Advance ()); + Assert.AreEqual (State.Directive, tk.State); + + //line 2, 3 + Assert.IsTrue (tk.Advance ()); + Assert.AreEqual (new Location (tf, 2, 1), tk.Location); + Assert.AreEqual (State.Content, tk.State); + Assert.AreEqual ("Line One\nLine Two\n", tk.Value); + + //line 4, 5, 6 + Assert.IsTrue (tk.Advance ()); + Assert.AreEqual (new Location (tf, 4, 1), tk.TagStartLocation); + Assert.AreEqual (new Location (tf, 4, 3), tk.Location); + Assert.AreEqual (new Location (tf, 6, 3), tk.TagEndLocation); + Assert.AreEqual (State.Block, tk.State); + Assert.AreEqual ("\nfoo\n", tk.Value); + + //line 7 + Assert.IsTrue (tk.Advance ()); + Assert.AreEqual (new Location (tf, 7, 1), tk.Location); + Assert.AreEqual (State.Content, tk.State); + Assert.AreEqual ("Line Three ", tk.Value); + Assert.IsTrue (tk.Advance ()); + Assert.AreEqual (new Location (tf, 7, 12), tk.TagStartLocation); + Assert.AreEqual (new Location (tf, 7, 15), tk.Location); + Assert.AreEqual (new Location (tf, 7, 22), tk.TagEndLocation); + Assert.AreEqual (State.Expression, tk.State); + Assert.AreEqual (" bar ", tk.Value); + + //line 8 + Assert.IsTrue (tk.Advance ()); + Assert.AreEqual (new Location (tf, 7, 22), tk.Location); + Assert.AreEqual (State.Content, tk.State); + Assert.AreEqual ("\nLine Four\n", tk.Value); + + //line 9, 10, 11 + Assert.IsTrue (tk.Advance ()); + Assert.AreEqual (new Location (tf, 9, 1), tk.TagStartLocation); + Assert.AreEqual (new Location (tf, 9, 4), tk.Location); + Assert.AreEqual (new Location (tf, 11, 3), tk.TagEndLocation); + Assert.AreEqual (State.Helper, tk.State); + Assert.AreEqual (" \nbaz \\#>\n", tk.Value); + + //line 12 + Assert.IsTrue (tk.Advance ()); + Assert.AreEqual (new Location (tf, 12, 1), tk.Location); + Assert.AreEqual (State.Content, tk.State); + Assert.AreEqual ("", tk.Value); + + //EOF + Assert.IsFalse (tk.Advance ()); + Assert.AreEqual (new Location (tf, 12, 1), tk.Location); + Assert.AreEqual (State.EOF, tk.State); + } + + [Test] + public void ParseTest () + { + string tf = "test.input"; + + ParsedTemplate pt = new ParsedTemplate ("test.input"); + Tokeniser tk = new Tokeniser (tf, ParseSample1); + DummyHost host = new DummyHost (); + pt.Parse (host, tk); + + Assert.AreEqual (0, pt.Errors.Count); + var content = new List (pt.Content); + var dirs = new List (pt.Directives); + + Assert.AreEqual (1, dirs.Count); + Assert.AreEqual (6, content.Count); + + Assert.AreEqual ("template", dirs[0].Name); + Assert.AreEqual (1, dirs[0].Attributes.Count); + Assert.AreEqual ("C#v3.5", dirs[0].Attributes["language"]); + Assert.AreEqual (new Location (tf, 1, 1), dirs[0].TagStartLocation); + Assert.AreEqual (new Location (tf, 1, 34), dirs[0].EndLocation); + + Assert.AreEqual ("Line One\nLine Two\n", content[0].Text); + Assert.AreEqual ("\nfoo\n", content[1].Text); + Assert.AreEqual ("Line Three ", content[2].Text); + Assert.AreEqual (" bar ", content[3].Text); + Assert.AreEqual ("\nLine Four\n", content[4].Text); + Assert.AreEqual (" \nbaz \\#>\n", content[5].Text); + + Assert.AreEqual (SegmentType.Content, content[0].Type); + Assert.AreEqual (SegmentType.Block, content[1].Type); + Assert.AreEqual (SegmentType.Content, content[2].Type); + Assert.AreEqual (SegmentType.Expression, content[3].Type); + Assert.AreEqual (SegmentType.Content, content[4].Type); + Assert.AreEqual (SegmentType.Helper, content[5].Type); + + Assert.AreEqual (new Location (tf, 4, 1), content[1].TagStartLocation); + Assert.AreEqual (new Location (tf, 7, 12), content[3].TagStartLocation); + Assert.AreEqual (new Location (tf, 9, 1), content[5].TagStartLocation); + + Assert.AreEqual (new Location (tf, 2, 1), content[0].StartLocation); + Assert.AreEqual (new Location (tf, 4, 3), content[1].StartLocation); + Assert.AreEqual (new Location (tf, 7, 1), content[2].StartLocation); + Assert.AreEqual (new Location (tf, 7, 15), content[3].StartLocation); + Assert.AreEqual (new Location (tf, 7, 22), content[4].StartLocation); + Assert.AreEqual (new Location (tf, 9, 4), content[5].StartLocation); + + Assert.AreEqual (new Location (tf, 6, 3), content[1].EndLocation); + Assert.AreEqual (new Location (tf, 7, 22), content[3].EndLocation); + Assert.AreEqual (new Location (tf, 11, 3), content[5].EndLocation); + } + + + } +} diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/TemplateEnginePreprocessTemplateTests.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/TemplateEnginePreprocessTemplateTests.cs new file mode 100644 index 00000000..02bcab11 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/TemplateEnginePreprocessTemplateTests.cs @@ -0,0 +1,246 @@ +// +// TemplateEnginePreprocessTemplateTests.cs +// +// Author: +// Matt Ward +// +// Copyright (c) 2010 Matt Ward +// +// 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. + +using System; +using System.Collections.Generic; +using System.IO; +using NUnit.Framework; +using Microsoft.VisualStudio.TextTemplating; + +namespace Mono.TextTemplating.Tests +{ + [TestFixture] + public class TemplateEnginePreprocessTemplateTests + { + [Test] + public void Preprocess () + { + string input = + "<#@ template language=\"C#\" #>\r\n" + + "Test\r\n"; + + string expectedOutput = OutputSample1; + string output = Preprocess (input); + + Assert.AreEqual (expectedOutput, output); + } + + #region Helpers + + string Preprocess (string input) + { + DummyHost host = new DummyHost (); + string className = "PreprocessedTemplate"; + string classNamespace = "Templating"; + string language = null; + string[] references = null; + + TemplatingEngine engine = new TemplatingEngine (); + string output = engine.PreprocessTemplate (input, host, className, classNamespace, out language, out references); + output = output.Replace ("\r\n", "\n"); + return TemplatingEngineHelper.StripHeader (output, "\n"); + } + + #endregion + + #region Expected output strings + + public static string OutputSample1 = +@" +namespace Templating { + + + public partial class PreprocessedTemplate : PreprocessedTemplateBase { + + public virtual string TransformText() { + this.GenerationEnvironment = null; + + #line 2 """" + this.Write(""Test\r\n""); + + #line default + #line hidden + return this.GenerationEnvironment.ToString(); + } + + protected virtual void Initialize() { + } + } + + public class PreprocessedTemplateBase { + + private global::System.Text.StringBuilder builder; + + private global::System.Collections.Generic.IDictionary session; + + private global::System.CodeDom.Compiler.CompilerErrorCollection errors; + + private string currentIndent = string.Empty; + + private global::System.Collections.Generic.Stack indents; + + private ToStringInstanceHelper _toStringHelper = new ToStringInstanceHelper(); + + public virtual global::System.Collections.Generic.IDictionary Session { + get { + return this.session; + } + set { + this.session = value; + } + } + + public global::System.Text.StringBuilder GenerationEnvironment { + get { + if ((this.builder == null)) { + this.builder = new global::System.Text.StringBuilder(); + } + return this.builder; + } + set { + this.builder = value; + } + } + + protected global::System.CodeDom.Compiler.CompilerErrorCollection Errors { + get { + if ((this.errors == null)) { + this.errors = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errors; + } + } + + public string CurrentIndent { + get { + return this.currentIndent; + } + } + + private global::System.Collections.Generic.Stack Indents { + get { + if ((this.indents == null)) { + this.indents = new global::System.Collections.Generic.Stack(); + } + return this.indents; + } + } + + public ToStringInstanceHelper ToStringHelper { + get { + return this._toStringHelper; + } + } + + public void Error(string message) { + this.Errors.Add(new global::System.CodeDom.Compiler.CompilerError(null, -1, -1, null, message)); + } + + public void Warning(string message) { + global::System.CodeDom.Compiler.CompilerError val = new global::System.CodeDom.Compiler.CompilerError(null, -1, -1, null, message); + val.IsWarning = true; + this.Errors.Add(val); + } + + public string PopIndent() { + if ((this.Indents.Count == 0)) { + return string.Empty; + } + int lastPos = (this.currentIndent.Length - this.Indents.Pop()); + string last = this.currentIndent.Substring(lastPos); + this.currentIndent = this.currentIndent.Substring(0, lastPos); + return last; + } + + public void PushIndent(string indent) { + this.Indents.Push(indent.Length); + this.currentIndent = (this.currentIndent + indent); + } + + public void ClearIndent() { + this.currentIndent = string.Empty; + this.Indents.Clear(); + } + + public void Write(string textToAppend) { + this.GenerationEnvironment.Append(textToAppend); + } + + public void Write(string format, params object[] args) { + this.GenerationEnvironment.AppendFormat(format, args); + } + + public void WriteLine(string textToAppend) { + this.GenerationEnvironment.Append(this.currentIndent); + this.GenerationEnvironment.AppendLine(textToAppend); + } + + public void WriteLine(string format, params object[] args) { + this.GenerationEnvironment.Append(this.currentIndent); + this.GenerationEnvironment.AppendFormat(format, args); + this.GenerationEnvironment.AppendLine(); + } + + public class ToStringInstanceHelper { + + private global::System.IFormatProvider formatProvider = global::System.Globalization.CultureInfo.InvariantCulture; + + public global::System.IFormatProvider FormatProvider { + get { + return this.formatProvider; + } + set { + if ((this.formatProvider == null)) { + throw new global::System.ArgumentNullException(""formatProvider""); + } + this.formatProvider = value; + } + } + + public string ToStringWithCulture(object objectToConvert) { + if ((objectToConvert == null)) { + throw new global::System.ArgumentNullException(""objectToConvert""); + } + global::System.Type type = objectToConvert.GetType(); + global::System.Type iConvertibleType = typeof(global::System.IConvertible); + if (iConvertibleType.IsAssignableFrom(type)) { + return ((global::System.IConvertible)(objectToConvert)).ToString(this.formatProvider); + } + global::System.Reflection.MethodInfo methInfo = type.GetMethod(""ToString"", new global::System.Type[] { + iConvertibleType}); + if ((methInfo != null)) { + return ((string)(methInfo.Invoke(objectToConvert, new object[] { + this.formatProvider}))); + } + return objectToConvert.ToString(); + } + } + } +} +"; + #endregion + } +} diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/TemplatingEngineHelper.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/TemplatingEngineHelper.cs new file mode 100644 index 00000000..6238f7a8 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating.Tests/TemplatingEngineHelper.cs @@ -0,0 +1,51 @@ +// +// Test.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2009 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. + +using System; +using System.IO; + +namespace Mono.TextTemplating.Tests +{ + public static class TemplatingEngineHelper + { + public static string StripHeader (string input, string newLine) + { + using (var writer = new StringWriter ()) { + using (var reader = new StringReader (input)) { + for (int i = 0; i < 9; i++) { + reader.ReadLine (); + } + string line; + while ((line = reader.ReadLine ()) != null) { + writer.Write (line); + writer.Write (newLine); + } + } + return writer.ToString (); + } + } + } +} diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/AssemblyInfo.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/AssemblyInfo.cs new file mode 100644 index 00000000..13849716 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/AssemblyInfo.cs @@ -0,0 +1,37 @@ +// +// AssemblyInfo.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2009 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. +using System.Reflection; +using System.Runtime.CompilerServices; +using System; + +[assembly: AssemblyTitle("Mono.TextTemplating")] +[assembly: AssemblyDescription("An implementation of Visual Studio's T4 text templating")] +[assembly: AssemblyCompany("The Mono Project")] +[assembly: AssemblyProduct("MonoDevelop")] +[assembly: AssemblyCopyright("MIT/X11")] +[assembly: CLSCompliant (true)] + +//[assembly: AssemblyVersion("1.0.0.0")] diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/ChangeLog b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/ChangeLog new file mode 100644 index 00000000..51377760 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/ChangeLog @@ -0,0 +1,212 @@ +2010-03-15 Michael Hutchinson + + * Mono.TextTemplating/TemplateGenerator.cs: Expose OutputFile + for custom tool to access. + +2010-03-01 Michael Hutchinson + + * Mono.TextTemplating/CrossAppDomainAssemblyResolver.cs: A + handler for AssemblyResolve events that looks them up in the + domain that created the resolver. + + * Makefile.am: + * Mono.TextTemplating.csproj: Added file. + +2009-11-27 Olivier Dagenais + * Mono.TextTemplating/ParsedTemplate.cs: Fixed a bug where the + location of an error was being ignored. + +2009-11-27 Olivier Dagenais + + * Mono.TextTemplating/TemplatingEngine.cs: Mark the generated + type as partial. + +2009-11-25 Michael Hutchinson + + * Mono.TextTemplating/ParsedTemplate.cs: Don't check if + included file exists before trying to resolve it from the + host, because host may use include paths. Patch from Aaron + Bockover. + +2009-08-17 Michael Hutchinson + + * Mono.TextTemplating/TemplatingEngine.cs: Fix NRE when + template fails to compile. + +2009-08-12 Michael Hutchinson + + * Makefile.am: + * Mono.TextTemplating.csproj: Include the ASP.NET MVC and + TextTemplating addins in the main solution and build. + +2009-08-11 Michael Hutchinson + + * Mono.TextTemplating.csproj: + * Mono.TextTemplating/ParsedTemplate.cs: + * Mono.TextTemplating/CompiledTemplate.cs: + * Mono.TextTemplating/TemplatingEngine.cs: + * Mono.TextTemplating/TemplateGenerator.cs: + * Mono.TextTemplating/IExtendedTextTemplatingEngineHost.cs: + Add support for caching compiled templates, and a couple of + bugfixes. Patch from Nathan Baulch + (nathan.baulch@gmail.com). + +2009-06-25 Michael Hutchinson + + * Mono.TextTemplating/TemplatingEngine.cs: Handle expressions + and content in helpers, based on patch from Nathan Baulch. + Liberally add C# 3 sugar to neaten up CodeDOM usage. + +2009-06-25 Michael Hutchinson + + * Mono.TextTemplating/TemplateGenerator.cs: Added overload for + Process template that uses input/output strings directly, + avoiding file read/write. Expose engine to subclasses. + + * Mono.TextTemplating/Tokeniser.cs: Remove outdated TODO. + +2009-04-13 Michael Hutchinson + + * Microsoft.VisualStudio.TextTemplating/ToStringHelper.cs: Use + IConvertible.ToString (formatProvider) when possible. + + Thanks to Stuart Carnie for this patch. + +2009-04-13 Michael Hutchinson + + * Mono.TextTemplating/Tokeniser.cs: Add support for Mac and + Windows newlines. + + * Mono.TextTemplating/TemplatingEngine.cs: Keep temp files + when in debug mode, so that the generated code can be + debugged. + + * Mono.TextTemplating/ParsedTemplate.cs: Fixes for csc + compilation. + + Thanks to Stuart Carnie for this patch. + +2009-04-03 Michael Hutchinson + + * Mono.TextTemplating.csproj: + * Mono.TextTemplating/TemplatingEngine.cs: + * Mono.TextTemplating/TemplateSettings.cs: + * Microsoft.VisualStudio.TextTemplating/Engine.cs: Move the + real engine into the Mono.TextTemplating namespace and + expose helper methods so that they can be tested. + +2009-03-13 Michael Hutchinson + + * Mono.TextTemplating.csproj: Move output dir from ../bin to + ../build. + +2009-03-12 Michael Hutchinson + + * Mono.TextTemplating/Tokeniser.cs: Tweaked location of next + state after directive. + +2009-03-12 Michael Hutchinson + + * Mono.TextTemplating/Tokeniser.cs: Location tweaks within + directives. + + * Mono.TextTemplating/ParsedTemplate.cs: Make Location + equatable. + +2009-03-10 Michael Hutchinson + + * Mono.TextTemplating/Tokeniser.cs: + * Mono.TextTemplating/ParsedTemplate.cs: Fix end location + capture after newline handling changes. + +2009-03-10 Michael Hutchinson + + * Mono.TextTemplating/Tokeniser.cs: + * Microsoft.VisualStudio.TextTemplating/Engine.cs: Match T4's + newline handling. + +2009-03-10 Michael Hutchinson + + * Mono.TextTemplating/ParsedTemplate.cs: Fix logic that + prevented adding directives. + +2009-03-09 Michael Hutchinson + + * Mono.TextTemplating/Tokeniser.cs: + * Mono.TextTemplating/ParsedTemplate.cs: More accurate + location captures. Capture start of tags as well as start of + content. + +2009-03-09 Michael Hutchinson + + * Mono.TextTemplating/TemplateGenerator.cs: Report exceptions + in errors. + + * Mono.TextTemplating/Tokeniser.cs: Make API public. + + * Mono.TextTemplating/ParsedTemplate.cs: Unify segment types. + Track end locations. Make API public. Allow parsing without + includes. + + * Microsoft.VisualStudio.TextTemplating/Engine.cs: Track + location API. + +2009-03-06 Michael Hutchinson + + * Mono.TextTemplating/TemplateGenerator.cs: Fix + SetFileExtension. + + * Microsoft.VisualStudio.TextTemplating/Engine.cs: Capture + hostspecific attribute from template directive. + +2009-03-05 Michael Hutchinson + + * Mono.TextTemplating/TemplateGenerator.cs: Fix output + extension changing. + + * Mono.TextTemplating/Tokeniser.cs: Fix helper regions. + +2009-03-05 Michael Hutchinson + + * Mono.TextTemplating.csproj: Updated. + + * Mono.TextTemplating/TemplateGenerator.cs: Simple template + host implementation. Doesn't handle everything yet. + + * Mono.TextTemplating/Tokeniser.cs: Fix a number of offset + issues that broke most captures. Only allow EOF in content + regions, and in this case capture the last content. Track + current column, for error reporting. + + * Mono.TextTemplating/ParsedTemplate.cs: Overhaul location + tracking for error reporting. Don't record empty segments. + + * Microsoft.VisualStudio.TextTemplating/Engine.cs: Use run + method instead of runner, since the whole thing's done in + the appdomain now. Catch errors from the runner. Use host's + default assemblies and imports. Track ParsedTemplate error + reporting changes. Filter out content regions with only a + single newline. + + * Microsoft.VisualStudio.TextTemplating/ToStringHelper.cs: + Don't cache delegates; this won't work for instances. Maybe + IL generation is called for. + +2009-03-04 Michael Hutchinson + + * AssemblyInfo.cs: + * Mono.TextTemplating: + * Mono.TextTemplating.csproj: + * Mono.TextTemplating/Tokeniser.cs: + * Microsoft.VisualStudio.TextTemplating: + * Mono.TextTemplating/ParsedTemplate.cs: + * Microsoft.VisualStudio.TextTemplating/Engine.cs: + * Microsoft.VisualStudio.TextTemplating/ToStringHelper.cs: + * Microsoft.VisualStudio.TextTemplating/DirectiveProcessor.cs: + * Microsoft.VisualStudio.TextTemplating/TextTransformation.cs: + * Microsoft.VisualStudio.TextTemplating/ITextTemplatingEngineHost.cs: + * Microsoft.VisualStudio.TextTemplating/DirectiveProcessorException.cs: + * Microsoft.VisualStudio.TextTemplating/RequiresProvidesDirectiveProcessor.cs: + Move T4 implementation to its own assembly. Tweak some + appdomain stuff. + diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Makefile.am b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Makefile.am new file mode 100644 index 00000000..72ec1552 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Makefile.am @@ -0,0 +1,55 @@ +ADDIN_BUILD = $(top_builddir)/build/AddIns/MonoDevelop.TextTemplating +ASSEMBLY = $(ADDIN_BUILD)/Mono.TextTemplating.dll + +DEPS = + +REFS = \ + -r:System \ + -r:System.Core + +FILES = \ + AssemblyInfo.cs \ + Microsoft.VisualStudio.TextTemplating/AssemblyCacheMonitor.cs \ + Microsoft.VisualStudio.TextTemplating/DirectiveProcessor.cs \ + Microsoft.VisualStudio.TextTemplating/DirectiveProcessorException.cs \ + Microsoft.VisualStudio.TextTemplating/EncodingHelper.cs \ + Microsoft.VisualStudio.TextTemplating/Engine.cs \ + Microsoft.VisualStudio.TextTemplating/Interfaces.cs \ + Microsoft.VisualStudio.TextTemplating/ParameterDirectiveProcessor.cs \ + Microsoft.VisualStudio.TextTemplating/RequiresProvidesDirectiveProcessor.cs \ + Microsoft.VisualStudio.TextTemplating/TextTemplatingSession.cs \ + Microsoft.VisualStudio.TextTemplating/TextTransformation.cs \ + Microsoft.VisualStudio.TextTemplating/ToStringHelper.cs \ + Mono.TextTemplating/CompiledTemplate.cs \ + Mono.TextTemplating/CrossAppDomainAssemblyResolver.cs \ + Mono.TextTemplating/ParsedTemplate.cs \ + Mono.TextTemplating/TemplateGenerator.cs \ + Mono.TextTemplating/TemplateSettings.cs \ + Mono.TextTemplating/TemplatingEngine.cs \ + Mono.TextTemplating/Tokeniser.cs + +RES = + +all: $(ASSEMBLY) $(ASSEMBLY).mdb $(DATA_FILE_BUILD) + +$(ASSEMBLY): $(build_sources) $(build_resources) $(DEPS) + mkdir -p $(ADDIN_BUILD) + $(CSC) $(CSC_FLAGS) -debug -out:$@ -target:library $(REFS) $(build_deps) \ + $(build_resources:%=/resource:%) $(build_sources) + +$(ASSEMBLY).mdb: $(ASSEMBLY) + +$(DATA_FILE_BUILD): $(srcdir)$(subst $(ADDIN_BUILD),, $@) + mkdir -p $(ADDIN_BUILD)/Schemas + cp $(srcdir)/$(subst $(ADDIN_BUILD),,$@) $@ + +check: all + +assemblydir = $(MD_ADDIN_DIR)/MonoDevelop.TextTemplating +assembly_DATA = $(ASSEMBLY) $(ASSEMBLY).mdb + +CLEANFILES = $(ASSEMBLY) $(ASSEMBLY).mdb +EXTRA_DIST = $(FILES) $(RES) + +include $(top_srcdir)/Makefile.include + diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/AssemblyCacheMonitor.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/AssemblyCacheMonitor.cs new file mode 100644 index 00000000..68a17fb0 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/AssemblyCacheMonitor.cs @@ -0,0 +1,43 @@ +// +// AssemblyCacheMonitor.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2010 Novell, Inc. +// +// 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. + +using System; + +namespace Microsoft.VisualStudio.TextTemplating +{ + public sealed class AssemblyCacheMonitor : MarshalByRefObject + { + public AssemblyCacheMonitor () + { + } + + public int GetStaleAssembliesCount (TimeSpan assemblyStaleTime) + { + throw new NotImplementedException (); + } + } +} + diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/DirectiveProcessor.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/DirectiveProcessor.cs new file mode 100644 index 00000000..f86dbd2e --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/DirectiveProcessor.cs @@ -0,0 +1,63 @@ +// +// DirectiveProcessor.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2009 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. + +using System; +using System.Collections.Generic; +using System.CodeDom.Compiler; + +namespace Microsoft.VisualStudio.TextTemplating +{ + public abstract class DirectiveProcessor + { + protected DirectiveProcessor () + { + } + + public virtual void Initialize (ITextTemplatingEngineHost host) + { + if (host == null) + throw new ArgumentNullException ("host"); + } + + public virtual void StartProcessingRun (CodeDomProvider languageProvider, string templateContents, CompilerErrorCollection errors) + { + if (languageProvider == null) + throw new ArgumentNullException ("languageProvider"); + this.Errors = errors; + } + + public abstract void FinishProcessingRun (); + public abstract string GetClassCodeForProcessingRun (); + public abstract string[] GetImportsForProcessingRun (); + public abstract string GetPostInitializationCodeForProcessingRun (); + public abstract string GetPreInitializationCodeForProcessingRun (); + public abstract string[] GetReferencesForProcessingRun (); + public abstract bool IsDirectiveSupported (string directiveName); + public abstract void ProcessDirective (string directiveName, IDictionary arguments); + + protected CompilerErrorCollection Errors { get; private set; } + } +} diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/DirectiveProcessorException.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/DirectiveProcessorException.cs new file mode 100644 index 00000000..1d95faca --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/DirectiveProcessorException.cs @@ -0,0 +1,56 @@ +// +// DirectiveProcessorException.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2009 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. + +using System; +using System.Runtime.Serialization; + +namespace Microsoft.VisualStudio.TextTemplating +{ + + [Serializable] + public class DirectiveProcessorException : Exception + { + + public DirectiveProcessorException () + { + } + + public DirectiveProcessorException (string message) + : base (message) + { + } + + public DirectiveProcessorException (SerializationInfo info, StreamingContext context) + : base (info, context) + { + } + + public DirectiveProcessorException (string message, Exception inner) + : base (message, inner) + { + } + } +} diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/EncodingHelper.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/EncodingHelper.cs new file mode 100644 index 00000000..9934646b --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/EncodingHelper.cs @@ -0,0 +1,40 @@ +// +// EncodingHelper.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2010 Novell, Inc. +// +// 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. + +using System; +using System.Text; + +namespace Microsoft.VisualStudio.TextTemplating +{ + public static class EncodingHelper + { + public static Encoding GetEncoding (string filePath) + { + throw new NotImplementedException (); + } + } +} + diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/Engine.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/Engine.cs new file mode 100644 index 00000000..fc9c9aac --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/Engine.cs @@ -0,0 +1,58 @@ +// +// Engine.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2009 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. + +using System; +using System.IO; +using System.Text; +using System.Collections.Generic; +using System.CodeDom; +using System.CodeDom.Compiler; +using Mono.TextTemplating; + +namespace Microsoft.VisualStudio.TextTemplating +{ + public class Engine : ITextTemplatingEngine + { + TemplatingEngine engine = new TemplatingEngine (); + + public Engine () + { + } + + public string ProcessTemplate (string content, ITextTemplatingEngineHost host) + { + return engine.ProcessTemplate (content, host); + } + + public string PreprocessTemplate (string content, ITextTemplatingEngineHost host, string className, + string classNamespace, out string language, out string[] references) + { + return engine.PreprocessTemplate (content, host, className, classNamespace, out language, out references); + } + + public const string CacheAssembliesOptionString = "CacheAssemblies"; + } +} diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/Interfaces.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/Interfaces.cs new file mode 100644 index 00000000..5ea7413f --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/Interfaces.cs @@ -0,0 +1,84 @@ +// +// ITextTemplatingEngineHost.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2009-2010 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. + +using System; +using System.Text; +using System.CodeDom.Compiler; +using System.Collections.Generic; +using System.Collections; +using System.Runtime.Serialization; + +namespace Microsoft.VisualStudio.TextTemplating +{ + public interface IRecognizeHostSpecific + { + void SetProcessingRunIsHostSpecific (bool hostSpecific); + bool RequiresProcessingRunIsHostSpecific { get; } + } + + [CLSCompliant(true)] + public interface ITextTemplatingEngine + { + string ProcessTemplate (string content, ITextTemplatingEngineHost host); + string PreprocessTemplate (string content, ITextTemplatingEngineHost host, string className, + string classNamespace, out string language, out string[] references); + } + + [CLSCompliant(true)] + public interface ITextTemplatingEngineHost + { + object GetHostOption (string optionName); + bool LoadIncludeText (string requestFileName, out string content, out string location); + void LogErrors (CompilerErrorCollection errors); + AppDomain ProvideTemplatingAppDomain (string content); + string ResolveAssemblyReference (string assemblyReference); + Type ResolveDirectiveProcessor (string processorName); + string ResolveParameterValue (string directiveId, string processorName, string parameterName); + string ResolvePath (string path); + void SetFileExtension (string extension); + void SetOutputEncoding (Encoding encoding, bool fromOutputDirective); + IList StandardAssemblyReferences { get; } + IList StandardImports { get; } + string TemplateFile { get; } + } + + [CLSCompliant(true)] + public interface ITextTemplatingSession : + IEquatable, IEquatable, IDictionary, + ICollection>, + IEnumerable>, + IEnumerable, ISerializable + { + Guid Id { get; } + } + + [CLSCompliant(true)] + public interface ITextTemplatingSessionHost + { + ITextTemplatingSession CreateSession (); + ITextTemplatingSession Session { get; set; } + } +} diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/ParameterDirectiveProcessor.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/ParameterDirectiveProcessor.cs new file mode 100644 index 00000000..9518a428 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/ParameterDirectiveProcessor.cs @@ -0,0 +1,268 @@ +// +// ParameterDirectiveProcessor.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2010 Novell, Inc. +// +// 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. + +using System; +using System.Collections.Generic; +using System.CodeDom.Compiler; +using System.CodeDom; +using System.IO; +using System.Linq; +using System.Reflection; + +namespace Microsoft.VisualStudio.TextTemplating +{ + public sealed class ParameterDirectiveProcessor : DirectiveProcessor, IRecognizeHostSpecific + { + CodeDomProvider provider; + bool isCSharp; + bool useMonoHack; + + bool hostSpecific; + List postStatements = new List (); + CodeTypeMemberCollection members = new CodeTypeMemberCollection (); + + public ParameterDirectiveProcessor () + { + } + + public override void StartProcessingRun (CodeDomProvider languageProvider, string templateContents, CompilerErrorCollection errors) + { + base.StartProcessingRun (languageProvider, templateContents, errors); + this.provider = languageProvider; + //HACK: Mono as of 2.10.2 doesn't implement GenerateCodeFromMember + if (Type.GetType ("Mono.Runtime") != null) + useMonoHack = true; + if (languageProvider is Microsoft.CSharp.CSharpCodeProvider) + isCSharp = true; + postStatements.Clear (); + members.Clear (); + } + + public override void FinishProcessingRun () + { + var statement = new CodeConditionStatement ( + new CodeBinaryOperatorExpression ( + new CodePropertyReferenceExpression ( + new CodePropertyReferenceExpression (new CodeThisReferenceExpression (), "Errors"), "HasErrors"), + CodeBinaryOperatorType.ValueEquality, + new CodePrimitiveExpression (false)), + postStatements.ToArray ()); + + postStatements.Clear (); + postStatements.Add (statement); + } + + public override string GetClassCodeForProcessingRun () + { + var options = new CodeGeneratorOptions (); + using (var sw = new StringWriter ()) { + GenerateCodeFromMembers (sw, options); + return Indent (sw.ToString (), " "); + } + } + + string Indent (string s, string indent) + { + if (isCSharp) + return Mono.TextTemplating.TemplatingEngine.IndentSnippetText (s, indent); + return s; + } + + public override string[] GetImportsForProcessingRun () + { + return null; + } + + public override string GetPostInitializationCodeForProcessingRun () + { + return Indent (StatementsToCode (postStatements), " "); + } + + public override string GetPreInitializationCodeForProcessingRun () + { + return null; + } + + string StatementsToCode (List statements) + { + var options = new CodeGeneratorOptions (); + using (var sw = new StringWriter ()) { + foreach (var statement in statements) + provider.GenerateCodeFromStatement (statement, sw, options); + return sw.ToString (); + } + } + + public override string[] GetReferencesForProcessingRun () + { + return null; + } + + public override bool IsDirectiveSupported (string directiveName) + { + return directiveName == "parameter"; + } + + public override void ProcessDirective (string directiveName, IDictionary arguments) + { + string name = arguments["name"]; + string type = arguments["type"]; + if (string.IsNullOrEmpty (name)) + throw new DirectiveProcessorException ("Parameter directive has no name argument"); + if (string.IsNullOrEmpty (type)) + throw new DirectiveProcessorException ("Parameter directive has no type argument"); + + string fieldName = "_" + name + "Field"; + var typeRef = new CodeTypeReference (type); + var thisRef = new CodeThisReferenceExpression (); + var fieldRef = new CodeFieldReferenceExpression (thisRef, fieldName); + + var property = new CodeMemberProperty () { + Name = name, + Attributes = MemberAttributes.Public | MemberAttributes.Final, + HasGet = true, + HasSet = false, + Type = typeRef + }; + property.GetStatements.Add (new CodeMethodReturnStatement (fieldRef)); + members.Add (new CodeMemberField (typeRef, fieldName)); + members.Add (property); + + string acquiredName = "_" + name + "Acquired"; + var valRef = new CodeVariableReferenceExpression ("data"); + var namePrimitive = new CodePrimitiveExpression (name); + var sessionRef = new CodePropertyReferenceExpression (thisRef, "Session"); + var callContextTypeRefExpr = new CodeTypeReferenceExpression ("System.Runtime.Remoting.Messaging.CallContext"); + var nullPrim = new CodePrimitiveExpression (null); + + var acquiredVariable = new CodeVariableDeclarationStatement (typeof (bool), acquiredName, new CodePrimitiveExpression (false)); + var acquiredVariableRef = new CodeVariableReferenceExpression (acquiredVariable.Name); + this.postStatements.Add (acquiredVariable); + + //checks the local called "data" can be cast and assigned to the field, and if successful, sets acquiredVariable to true + var checkCastThenAssignVal = new CodeConditionStatement ( + new CodeMethodInvokeExpression ( + new CodeTypeOfExpression (typeRef), "IsAssignableFrom", new CodeMethodInvokeExpression (valRef, "GetType")), + new CodeStatement[] { + new CodeAssignStatement (fieldRef, new CodeCastExpression (typeRef, valRef)), + new CodeAssignStatement (acquiredVariableRef, new CodePrimitiveExpression (true)), + }, + new CodeStatement[] { + new CodeExpressionStatement (new CodeMethodInvokeExpression (thisRef, "Error", + new CodePrimitiveExpression ("The type '" + type + "' of the parameter '" + name + + "' did not match the type passed to the template"))), + }); + + //tries to gets the value from the session + var checkSession = new CodeConditionStatement ( + new CodeBinaryOperatorExpression (NotNull (sessionRef), CodeBinaryOperatorType.BooleanAnd, + new CodeMethodInvokeExpression (sessionRef, "ContainsKey", namePrimitive)), + new CodeVariableDeclarationStatement (typeof (object), "data", new CodeIndexerExpression (sessionRef, namePrimitive)), + checkCastThenAssignVal); + + this.postStatements.Add (checkSession); + + //if acquiredVariable is false, tries to gets the value from the host + if (hostSpecific) { + var hostRef = new CodePropertyReferenceExpression (thisRef, "Host"); + var checkHost = new CodeConditionStatement ( + BooleanAnd (IsFalse (acquiredVariableRef), NotNull (hostRef)), + new CodeVariableDeclarationStatement (typeof (string), "data", + new CodeMethodInvokeExpression (hostRef, "ResolveParameterValue", nullPrim, nullPrim, namePrimitive)), + new CodeConditionStatement (NotNull (valRef), checkCastThenAssignVal)); + + this.postStatements.Add (checkHost); + } + + //if acquiredVariable is false, tries to gets the value from the call context + var checkCallContext = new CodeConditionStatement ( + IsFalse (acquiredVariableRef), + new CodeVariableDeclarationStatement (typeof (object), "data", + new CodeMethodInvokeExpression (callContextTypeRefExpr, "LogicalGetData", namePrimitive)), + new CodeConditionStatement (NotNull (valRef), checkCastThenAssignVal)); + + this.postStatements.Add (checkCallContext); + } + + static CodeBinaryOperatorExpression NotNull (CodeExpression reference) + { + return new CodeBinaryOperatorExpression (reference, CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression (null)); + } + + static CodeBinaryOperatorExpression IsFalse (CodeExpression expr) + { + return new CodeBinaryOperatorExpression (expr, CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (false)); + } + + static CodeBinaryOperatorExpression BooleanAnd (CodeExpression expr1, CodeExpression expr2) + { + return new CodeBinaryOperatorExpression (expr1, CodeBinaryOperatorType.BooleanAnd, expr2); + } + + void IRecognizeHostSpecific.SetProcessingRunIsHostSpecific (bool hostSpecific) + { + this.hostSpecific = hostSpecific; + } + + public bool RequiresProcessingRunIsHostSpecific { + get { return false; } + } + + void GenerateCodeFromMembers (StringWriter sw, CodeGeneratorOptions options) + { + if (!useMonoHack) { + foreach (CodeTypeMember member in members) + provider.GenerateCodeFromMember (member, sw, options); + } + + var cgType = typeof (CodeGenerator); + var cgInit = cgType.GetMethod ("InitOutput", BindingFlags.NonPublic | BindingFlags.Instance); + var cgFieldGen = cgType.GetMethod ("GenerateField", BindingFlags.NonPublic | BindingFlags.Instance); + var cgPropGen = cgType.GetMethod ("GenerateProperty", BindingFlags.NonPublic | BindingFlags.Instance); + +#pragma warning disable 0618 + var generator = (CodeGenerator) provider.CreateGenerator (); +#pragma warning restore 0618 + var dummy = new CodeTypeDeclaration ("Foo"); + + foreach (CodeTypeMember member in members) { + var f = member as CodeMemberField; + if (f != null) { + cgInit.Invoke (generator, new object[] { sw, options }); + cgFieldGen.Invoke (generator, new object[] { f }); + continue; + } + var p = member as CodeMemberProperty; + if (p != null) { + cgInit.Invoke (generator, new object[] { sw, options }); + cgPropGen.Invoke (generator, new object[] { p, dummy }); + continue; + } + } + } + } +} + diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/RequiresProvidesDirectiveProcessor.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/RequiresProvidesDirectiveProcessor.cs new file mode 100644 index 00000000..bb48357c --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/RequiresProvidesDirectiveProcessor.cs @@ -0,0 +1,196 @@ +// +// RequiresProvidesDirectiveProcessor.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2009 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. + +using System; +using System.Collections.Generic; +using System.CodeDom.Compiler; +using System.Text; + +namespace Microsoft.VisualStudio.TextTemplating +{ + + + public abstract class RequiresProvidesDirectiveProcessor : DirectiveProcessor + { + bool isInProcessingRun; + ITextTemplatingEngineHost host; + StringBuilder preInitBuffer = new StringBuilder (); + StringBuilder postInitBuffer = new StringBuilder (); + StringBuilder codeBuffer = new StringBuilder (); + CodeDomProvider languageProvider; + + protected RequiresProvidesDirectiveProcessor () + { + } + + public override void Initialize (ITextTemplatingEngineHost host) + { + base.Initialize (host); + this.host = host; + } + + protected abstract void InitializeProvidesDictionary (string directiveName, IDictionary providesDictionary); + protected abstract void InitializeRequiresDictionary (string directiveName, IDictionary requiresDictionary); + protected abstract string FriendlyName { get; } + + protected abstract void GeneratePostInitializationCode (string directiveName, StringBuilder codeBuffer, CodeDomProvider languageProvider, + IDictionary requiresArguments, IDictionary providesArguments); + protected abstract void GeneratePreInitializationCode (string directiveName, StringBuilder codeBuffer, CodeDomProvider languageProvider, + IDictionary requiresArguments, IDictionary providesArguments); + protected abstract void GenerateTransformCode (string directiveName, StringBuilder codeBuffer, CodeDomProvider languageProvider, + IDictionary requiresArguments, IDictionary providesArguments); + + protected virtual void PostProcessArguments (string directiveName, IDictionary requiresArguments, + IDictionary providesArguments) + { + } + + public override string GetClassCodeForProcessingRun () + { + AssertNotProcessing (); + return codeBuffer.ToString (); + } + + public override string[] GetImportsForProcessingRun () + { + AssertNotProcessing (); + return null; + } + + public override string[] GetReferencesForProcessingRun () + { + AssertNotProcessing (); + return null; + } + + public override string GetPostInitializationCodeForProcessingRun () + { + AssertNotProcessing (); + return postInitBuffer.ToString (); + } + + public override string GetPreInitializationCodeForProcessingRun () + { + AssertNotProcessing (); + return preInitBuffer.ToString (); + } + + public override void StartProcessingRun (CodeDomProvider languageProvider, string templateContents, CompilerErrorCollection errors) + { + AssertNotProcessing (); + isInProcessingRun = true; + base.StartProcessingRun (languageProvider, templateContents, errors); + + this.languageProvider = languageProvider; + codeBuffer.Length = 0; + preInitBuffer.Length = 0; + postInitBuffer.Length = 0; + } + + public override void FinishProcessingRun () + { + isInProcessingRun = false; + } + + void AssertNotProcessing () + { + if (isInProcessingRun) + throw new InvalidOperationException (); + } + + //FIXME: handle escaping + IEnumerable> ParseArgs (string args) + { + var pairs = args.Split (';'); + foreach (var p in pairs) { + int eq = p.IndexOf ('='); + var k = p.Substring (0, eq); + var v = p.Substring (eq); + yield return new KeyValuePair (k, v); + } + } + + public override void ProcessDirective (string directiveName, IDictionary arguments) + { + if (directiveName == null) + throw new ArgumentNullException ("directiveName"); + if (arguments == null) + throw new ArgumentNullException ("arguments"); + + var providesDictionary = new Dictionary (); + var requiresDictionary = new Dictionary (); + + string provides; + if (arguments.TryGetValue ("provides", out provides)) { + foreach (var arg in ParseArgs (provides)) { + providesDictionary.Add (arg.Key, arg.Value); + } + } + + string requires; + if (arguments.TryGetValue ("requires", out requires)) { + foreach (var arg in ParseArgs (requires)) { + requiresDictionary.Add (arg.Key, arg.Value); + } + } + + InitializeRequiresDictionary (directiveName, requiresDictionary); + InitializeProvidesDictionary (directiveName, providesDictionary); + + var id = ProvideUniqueId (directiveName, arguments, requiresDictionary, providesDictionary); + + foreach (var req in requiresDictionary) { + var val = host.ResolveParameterValue (id, FriendlyName, req.Key); + if (val != null) + requiresDictionary[req.Key] = val; + else if (req.Value == null) + throw new DirectiveProcessorException ("Could not resolve required value '" + req.Key + "'"); + } + + foreach (var req in providesDictionary) { + var val = host.ResolveParameterValue (id, FriendlyName, req.Key); + if (val != null) + providesDictionary[req.Key] = val; + } + + PostProcessArguments (directiveName, requiresDictionary, providesDictionary); + + GeneratePreInitializationCode (directiveName, preInitBuffer, languageProvider, requiresDictionary, providesDictionary); + GeneratePostInitializationCode (directiveName, postInitBuffer, languageProvider, requiresDictionary, providesDictionary); + GenerateTransformCode (directiveName, codeBuffer, languageProvider, requiresDictionary, providesDictionary); + } + + protected virtual string ProvideUniqueId (string directiveName, IDictionary arguments, + IDictionary requiresArguments, IDictionary providesArguments) + { + return directiveName; + } + + protected ITextTemplatingEngineHost Host { + get { return host; } + } + } +} diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/TextTemplatingSession.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/TextTemplatingSession.cs new file mode 100644 index 00000000..b29dbd01 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/TextTemplatingSession.cs @@ -0,0 +1,71 @@ +// +// TextTemplatingSession.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2010 Novell, Inc. +// +// 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. +using System; +using System.Collections.Generic; +using System.Collections; +using System.Runtime.Serialization; + +namespace Microsoft.VisualStudio.TextTemplating +{ + [Serializable] + public sealed class TextTemplatingSession : Dictionary, ITextTemplatingSession + { + public TextTemplatingSession () : this (Guid.NewGuid ()) + { + } + + public TextTemplatingSession (Guid id) + { + this.Id = id; + } + + public Guid Id { + get; private set; + } + + public override int GetHashCode () + { + return Id.GetHashCode (); + } + + public override bool Equals (object obj) + { + var o = obj as TextTemplatingSession; + return o != null && o.Equals (this); + } + + public bool Equals (Guid other) + { + return other.Equals (Id); + } + + public bool Equals (ITextTemplatingSession other) + { + return other != null && other.Id == this.Id; + } + } +} + diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/TextTransformation.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/TextTransformation.cs new file mode 100644 index 00000000..409a36a9 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/TextTransformation.cs @@ -0,0 +1,219 @@ +// +// TextTransformation.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2009 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. + +using System; +using System.CodeDom.Compiler; +using System.Collections.Generic; +using System.Text; + +namespace Microsoft.VisualStudio.TextTemplating +{ + public abstract class TextTransformation : IDisposable + { + Stack indents; + string currentIndent = string.Empty; + CompilerErrorCollection errors; + StringBuilder builder; + bool endsWithNewline; + + public TextTransformation () + { + } + + protected internal virtual void Initialize () + { + } + + public abstract string TransformText (); + + public virtual IDictionary Session { get; set; } + + #region Errors + + public void Error (string message) + { + Errors.Add (new CompilerError (null, -1, -1, null, message)); + } + + public void Warning (string message) + { + var err = new CompilerError (null, -1, -1, null, message) { + IsWarning = true, + }; + Errors.Add (err); + } + + protected internal CompilerErrorCollection Errors { + get { + if (errors == null) + errors = new CompilerErrorCollection (); + return errors; + } + } + + Stack Indents { + get { + if (indents == null) + indents = new Stack (); + return indents; + } + } + + #endregion + + #region Indents + + public string PopIndent () + { + if (Indents.Count == 0) + return ""; + int lastPos = currentIndent.Length - Indents.Pop (); + string last = currentIndent.Substring (lastPos); + currentIndent = currentIndent.Substring (0, lastPos); + return last; + } + + public void PushIndent (string indent) + { + if (indent == null) + throw new ArgumentNullException ("indent"); + Indents.Push (indent.Length); + currentIndent += indent; + } + + public void ClearIndent () + { + currentIndent = string.Empty; + Indents.Clear (); + } + + public string CurrentIndent { + get { return currentIndent; } + } + + #endregion + + #region Writing + + protected StringBuilder GenerationEnvironment { + get { + if (builder == null) + builder = new StringBuilder (); + return builder; + } + set { + builder = value; + } + } + + public void Write (string textToAppend) + { + if (string.IsNullOrEmpty (textToAppend)) + return; + + if ((GenerationEnvironment.Length == 0 || endsWithNewline) && CurrentIndent.Length > 0) { + GenerationEnvironment.Append (CurrentIndent); + } + endsWithNewline = false; + + char last = textToAppend[textToAppend.Length-1]; + if (last == '\n' || last == '\r') { + endsWithNewline = true; + } + + if (CurrentIndent.Length == 0) { + GenerationEnvironment.Append (textToAppend); + return; + } + + //insert CurrentIndent after every newline (\n, \r, \r\n) + //but if there's one at the end of the string, ignore it, it'll be handled next time thanks to endsWithNewline + int lastNewline = 0; + for (int i = 0; i < textToAppend.Length - 1; i++) { + char c = textToAppend[i]; + if (c == '\r') { + if (textToAppend[i + 1] == '\n') { + i++; + if (i == textToAppend.Length - 1) + break; + } + } else if (c != '\n') { + continue; + } + i++; + int len = i - lastNewline; + if (len > 0) { + GenerationEnvironment.Append (textToAppend, lastNewline, i - lastNewline); + } + GenerationEnvironment.Append (CurrentIndent); + lastNewline = i; + } + if (lastNewline > 0) + GenerationEnvironment.Append (textToAppend, lastNewline, textToAppend.Length - lastNewline); + else + GenerationEnvironment.Append (textToAppend); + } + + public void Write (string format, params object[] args) + { + Write (string.Format (format, args)); + } + + public void WriteLine (string textToAppend) + { + Write (textToAppend); + GenerationEnvironment.AppendLine (); + endsWithNewline = true; + } + + public void WriteLine (string format, params object[] args) + { + WriteLine (string.Format (format, args)); + } + + #endregion + + #region Dispose + + public void Dispose () + { + Dispose (true); + GC.SuppressFinalize (this); + } + + protected virtual void Dispose (bool disposing) + { + } + + ~TextTransformation () + { + Dispose (false); + } + + #endregion + + } +} diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/ToStringHelper.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/ToStringHelper.cs new file mode 100644 index 00000000..7f5934e2 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/ToStringHelper.cs @@ -0,0 +1,69 @@ +// +// ToStringHelper.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2009 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. + +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace Microsoft.VisualStudio.TextTemplating +{ + public static class ToStringHelper + { + static object [] formatProviderAsParameterArray; + + static IFormatProvider formatProvider = System.Globalization.CultureInfo.InvariantCulture; + + static ToStringHelper () + { + formatProviderAsParameterArray = new object[] { formatProvider }; + } + + public static string ToStringWithCulture (object objectToConvert) + { + if (objectToConvert == null) + throw new ArgumentNullException ("objectToConvert"); + + IConvertible conv = objectToConvert as IConvertible; + if (conv != null) + return conv.ToString (formatProvider); + + var str = objectToConvert as string; + if (str != null) + return str; + + //TODO: implement a cache of types and DynamicMethods + MethodInfo mi = objectToConvert.GetType ().GetMethod ("ToString", new Type[] { typeof (IFormatProvider) }); + if (mi != null) + return (string) mi.Invoke (objectToConvert, formatProviderAsParameterArray); + return objectToConvert.ToString (); + } + + public static IFormatProvider FormatProvider { + get { return (IFormatProvider)formatProviderAsParameterArray[0]; } + set { formatProviderAsParameterArray[0] = formatProvider = value; } + } + } +} diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating.csproj b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating.csproj new file mode 100644 index 00000000..2523f46b --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating.csproj @@ -0,0 +1,79 @@ + + + + Debug + AnyCPU + 9.0.21022 + 2.0 + {A2364D6A-00EF-417C-80A6-815726C70032} + Library + Mono.TextTemplating + Mono.TextTemplating + + + true + full + false + ..\bin + DEBUG + prompt + 4 + false + + + none + false + ..\bin + prompt + 4 + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/CompiledTemplate.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/CompiledTemplate.cs new file mode 100644 index 00000000..3e2f9458 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/CompiledTemplate.cs @@ -0,0 +1,113 @@ +// +// CompiledTemplate.cs +// +// Author: +// Nathan Baulch +// +// Copyright (c) 2009 Nathan Baulch +// +// 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. + +using System; +using System.Reflection; +using Microsoft.VisualStudio.TextTemplating; +using System.CodeDom.Compiler; +using System.Globalization; + +namespace Mono.TextTemplating +{ + public sealed class CompiledTemplate : MarshalByRefObject, IDisposable + { + ITextTemplatingEngineHost host; + TextTransformation tt; + CultureInfo culture; + string[] assemblyFiles; + + public CompiledTemplate (ITextTemplatingEngineHost host, CompilerResults results, string fullName, CultureInfo culture, + string[] assemblyFiles) + { + AppDomain.CurrentDomain.AssemblyResolve += ResolveReferencedAssemblies; + this.host = host; + this.culture = culture; + this.assemblyFiles = assemblyFiles; + Load (results, fullName); + } + + void Load (CompilerResults results, string fullName) + { + var assembly = results.CompiledAssembly; + Type transformType = assembly.GetType (fullName); + tt = (TextTransformation) Activator.CreateInstance (transformType); + + //set the host property if it exists + var hostProp = transformType.GetProperty ("Host", typeof (ITextTemplatingEngineHost)); + if (hostProp != null && hostProp.CanWrite) + hostProp.SetValue (tt, host, null); + + var sessionHost = host as ITextTemplatingSessionHost; + if (sessionHost != null) { + //FIXME: should we create a session if it's null? + tt.Session = sessionHost.Session; + } + } + + public string Process () + { + tt.Errors.Clear (); + + //set the culture + if (culture != null) + ToStringHelper.FormatProvider = culture; + else + ToStringHelper.FormatProvider = CultureInfo.InvariantCulture; + + tt.Initialize (); + + string output = null; + try { + output = tt.TransformText (); + } catch (Exception ex) { + tt.Error ("Error running transform: " + ex.ToString ()); + } + host.LogErrors (tt.Errors); + + ToStringHelper.FormatProvider = CultureInfo.InvariantCulture; + return output; + } + + System.Reflection.Assembly ResolveReferencedAssemblies (object sender, ResolveEventArgs args) + { + System.Reflection.Assembly asm = null; + foreach (var asmFile in assemblyFiles) { + var name = System.IO.Path.GetFileNameWithoutExtension (asmFile); + if (args.Name.StartsWith (name)) + asm = System.Reflection.Assembly.LoadFrom (asmFile); + } + return asm; + } + + public void Dispose () + { + if (host != null) { + host = null; + AppDomain.CurrentDomain.AssemblyResolve -= ResolveReferencedAssemblies; + } + } + } +} diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/CrossAppDomainAssemblyResolver.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/CrossAppDomainAssemblyResolver.cs new file mode 100644 index 00000000..593ed734 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/CrossAppDomainAssemblyResolver.cs @@ -0,0 +1,59 @@ +// +// CrossAppDomainAssemblyResolver.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2010 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. + +using System; + +namespace Mono.TextTemplating +{ + [Serializable] + /// + /// Provides a handler for AssemblyResolve events that looks them up in the domain that created the resolver. + /// + public class CrossAppDomainAssemblyResolver + { + ParentDomainLookup parent = new ParentDomainLookup (); + + public System.Reflection.Assembly Resolve (object sender, ResolveEventArgs args) + { + var location = parent.GetAssemblyPath (args.Name); + if (location != null) + return System.Reflection.Assembly.LoadFrom (location); + return null; + } + + class ParentDomainLookup : MarshalByRefObject + { + public string GetAssemblyPath (string name) + { + var assem = System.Reflection.Assembly.Load (name); + if (assem != null) + return assem.Location; + return null; + } + } + } +} + diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/ParsedTemplate.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/ParsedTemplate.cs new file mode 100644 index 00000000..f3ba0ae0 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/ParsedTemplate.cs @@ -0,0 +1,320 @@ +// +// Template.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2009 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. + +using System; +using System.CodeDom.Compiler; +using System.Collections.Generic; +using System.IO; +using Microsoft.VisualStudio.TextTemplating; + +namespace Mono.TextTemplating +{ + + + public class ParsedTemplate + { + List segments = new List (); + CompilerErrorCollection errors = new CompilerErrorCollection (); + string rootFileName; + + public ParsedTemplate (string rootFileName) + { + this.rootFileName = rootFileName; + } + + public List RawSegments { + get { return segments; } + } + + public IEnumerable Directives { + get { + foreach (ISegment seg in segments) { + Directive dir = seg as Directive; + if (dir != null) + yield return dir; + } + } + } + + public IEnumerable Content { + get { + foreach (ISegment seg in segments) { + TemplateSegment ts = seg as TemplateSegment; + if (ts != null) + yield return ts; + } + } + } + + public CompilerErrorCollection Errors { + get { return errors; } + } + + public static ParsedTemplate FromText (string content, ITextTemplatingEngineHost host) + { + ParsedTemplate template = new ParsedTemplate (host.TemplateFile); + try { + template.Parse (host, new Tokeniser (host.TemplateFile, content)); + } catch (ParserException ex) { + template.LogError (ex.Message, ex.Location); + } + return template; + } + + public void Parse (ITextTemplatingEngineHost host, Tokeniser tokeniser) + { + Parse (host, tokeniser, true); + } + + public void ParseWithoutIncludes (Tokeniser tokeniser) + { + Parse (null, tokeniser, false); + } + + void Parse (ITextTemplatingEngineHost host, Tokeniser tokeniser, bool parseIncludes) + { + bool skip = false; + while ((skip || tokeniser.Advance ()) && tokeniser.State != State.EOF) { + skip = false; + ISegment seg = null; + switch (tokeniser.State) { + case State.Block: + if (!String.IsNullOrEmpty (tokeniser.Value)) + seg = new TemplateSegment (SegmentType.Block, tokeniser.Value, tokeniser.Location); + break; + case State.Content: + if (!String.IsNullOrEmpty (tokeniser.Value)) + seg = new TemplateSegment (SegmentType.Content, tokeniser.Value, tokeniser.Location); + break; + case State.Expression: + if (!String.IsNullOrEmpty (tokeniser.Value)) + seg = new TemplateSegment (SegmentType.Expression, tokeniser.Value, tokeniser.Location); + break; + case State.Helper: + if (!String.IsNullOrEmpty (tokeniser.Value)) + seg = new TemplateSegment (SegmentType.Helper, tokeniser.Value, tokeniser.Location); + break; + case State.Directive: + Directive directive = null; + string attName = null; + while (!skip && tokeniser.Advance ()) { + switch (tokeniser.State) { + case State.DirectiveName: + if (directive == null) { + directive = new Directive (tokeniser.Value.ToLower (), tokeniser.Location); + directive.TagStartLocation = tokeniser.TagStartLocation; + if (!parseIncludes || directive.Name != "include") + segments.Add (directive); + } else + attName = tokeniser.Value; + break; + case State.DirectiveValue: + if (attName != null && directive != null) + directive.Attributes[attName.ToLower ()] = tokeniser.Value; + else + LogError ("Directive value without name", tokeniser.Location); + attName = null; + break; + case State.Directive: + if (directive != null) + directive.EndLocation = tokeniser.TagEndLocation; + break; + default: + skip = true; + break; + } + } + if (parseIncludes && directive.Name == "include") + Import (host, directive, Path.GetDirectoryName (tokeniser.Location.FileName)); + break; + default: + throw new InvalidOperationException (); + } + if (seg != null) { + seg.TagStartLocation = tokeniser.TagStartLocation; + seg.EndLocation = tokeniser.TagEndLocation; + segments.Add (seg); + } + } + } + + void Import (ITextTemplatingEngineHost host, Directive includeDirective, string relativeToDirectory) + { + string fileName; + if (includeDirective.Attributes.Count > 1 || !includeDirective.Attributes.TryGetValue ("file", out fileName)) { + LogError ("Unexpected attributes in include directive", includeDirective.StartLocation); + return; + } + + //try to resolve path relative to the file that included it + if (!Path.IsPathRooted (fileName)) { + string possible = Path.Combine (relativeToDirectory, fileName); + if (File.Exists (possible)) + fileName = possible; + } + + string content, resolvedName; + if (host.LoadIncludeText (fileName, out content, out resolvedName)) + Parse (host, new Tokeniser (resolvedName, content), true); + else + LogError ("Could not resolve include file '" + fileName + "'.", includeDirective.StartLocation); + } + + void LogError (string message, Location location, bool isWarning) + { + CompilerError err = new CompilerError (); + err.ErrorText = message; + if (location.FileName != null) { + err.Line = location.Line; + err.Column = location.Column; + err.FileName = location.FileName ?? string.Empty; + } else { + err.FileName = rootFileName ?? string.Empty; + } + err.IsWarning = isWarning; + errors.Add (err); + } + + public void LogError (string message) + { + LogError (message, Location.Empty, false); + } + + public void LogWarning (string message) + { + LogError (message, Location.Empty, true); + } + + public void LogError (string message, Location location) + { + LogError (message, location, false); + } + + public void LogWarning (string message, Location location) + { + LogError (message, location, true); + } + } + + public interface ISegment + { + Location StartLocation { get; } + Location EndLocation { get; set; } + Location TagStartLocation {get; set; } + } + + public class TemplateSegment : ISegment + { + public TemplateSegment (SegmentType type, string text, Location start) + { + this.Type = type; + this.StartLocation = start; + this.Text = text; + } + + public SegmentType Type { get; private set; } + public string Text { get; private set; } + public Location TagStartLocation { get; set; } + public Location StartLocation { get; private set; } + public Location EndLocation { get; set; } + } + + public class Directive : ISegment + { + public Directive (string name, Location start) + { + this.Name = name; + this.Attributes = new Dictionary (); + this.StartLocation = start; + } + + public string Name { get; private set; } + public Dictionary Attributes { get; private set; } + public Location TagStartLocation { get; set; } + public Location StartLocation { get; private set; } + public Location EndLocation { get; set; } + + public string Extract (string key) + { + string value; + if (!Attributes.TryGetValue (key, out value)) + return null; + Attributes.Remove (key); + return value; + } + } + + public enum SegmentType + { + Block, + Expression, + Content, + Helper + } + + public struct Location : IEquatable + { + public Location (string fileName, int line, int column) : this() + { + FileName = fileName; + Column = column; + Line = line; + } + + public int Line { get; private set; } + public int Column { get; private set; } + public string FileName { get; private set; } + + public static Location Empty { + get { return new Location (null, -1, -1); } + } + + public Location AddLine () + { + return new Location (this.FileName, this.Line + 1, 1); + } + + public Location AddCol () + { + return AddCols (1); + } + + public Location AddCols (int number) + { + return new Location (this.FileName, this.Line, this.Column + number); + } + + public override string ToString () + { + return string.Format("[{0} ({1},{2})]", FileName, Line, Column); + } + + public bool Equals (Location other) + { + return other.Line == Line && other.Column == Column && other.FileName == FileName; + } + } +} diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplateGenerator.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplateGenerator.cs new file mode 100644 index 00000000..dd752857 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplateGenerator.cs @@ -0,0 +1,373 @@ +// +// TemplatingHost.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2009 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. + +using System; +using System.Collections.Generic; +using System.CodeDom.Compiler; +using System.IO; +using System.Text; +using Microsoft.VisualStudio.TextTemplating; + +namespace Mono.TextTemplating +{ + public class TemplateGenerator : MarshalByRefObject, ITextTemplatingEngineHost + { + //re-usable + TemplatingEngine engine; + + //per-run variables + string inputFile, outputFile; + Encoding encoding; + + //host fields + CompilerErrorCollection errors = new CompilerErrorCollection (); + List refs = new List (); + List imports = new List (); + List includePaths = new List (); + List referencePaths = new List (); + + //host properties for consumers to access + public CompilerErrorCollection Errors { get { return errors; } } + public List Refs { get { return refs; } } + public List Imports { get { return imports; } } + public List IncludePaths { get { return includePaths; } } + public List ReferencePaths { get { return referencePaths; } } + public string OutputFile { get { return outputFile; } } + + public TemplateGenerator () + { + Refs.Add (typeof (TextTransformation).Assembly.Location); + Refs.Add (typeof(System.Uri).Assembly.Location); + Imports.Add ("System"); + } + + public CompiledTemplate CompileTemplate (string content) + { + if (String.IsNullOrEmpty (content)) + throw new ArgumentNullException ("content"); + + errors.Clear (); + encoding = Encoding.UTF8; + + return Engine.CompileTemplate (content, this); + } + + protected TemplatingEngine Engine { + get { + if (engine == null) + engine = new TemplatingEngine (); + return engine; + } + } + + public bool ProcessTemplate (string inputFile, string outputFile) + { + if (String.IsNullOrEmpty (inputFile)) + throw new ArgumentNullException ("inputFile"); + if (String.IsNullOrEmpty (outputFile)) + throw new ArgumentNullException ("outputFile"); + + string content; + try { + content = File.ReadAllText (inputFile); + } catch (IOException ex) { + errors.Clear (); + AddError ("Could not read input file '" + inputFile + "':\n" + ex.ToString ()); + return false; + } + + string output; + ProcessTemplate (inputFile, content, ref outputFile, out output); + + try { + if (!errors.HasErrors) + File.WriteAllText (outputFile, output, encoding); + } catch (IOException ex) { + AddError ("Could not write output file '" + outputFile + "':\n" + ex.ToString ()); + } + + return !errors.HasErrors; + } + + public bool ProcessTemplate (string inputFileName, string inputContent, ref string outputFileName, out string outputContent) + { + errors.Clear (); + encoding = Encoding.UTF8; + + this.outputFile = outputFileName; + this.inputFile = inputFileName; + outputContent = Engine.ProcessTemplate (inputContent, this); + outputFileName = this.outputFile; + + return !errors.HasErrors; + } + + public bool PreprocessTemplate (string inputFile, string className, string classNamespace, + string outputFile, System.Text.Encoding encoding, out string language, out string[] references) + { + language = null; + references = null; + + if (string.IsNullOrEmpty (inputFile)) + throw new ArgumentNullException ("inputFile"); + if (string.IsNullOrEmpty (outputFile)) + throw new ArgumentNullException ("outputFile"); + + string content; + try { + content = File.ReadAllText (inputFile); + } catch (IOException ex) { + errors.Clear (); + AddError ("Could not read input file '" + inputFile + "':\n" + ex.ToString ()); + return false; + } + + string output; + PreprocessTemplate (inputFile, className, classNamespace, content, out language, out references, out output); + + try { + if (!errors.HasErrors) + File.WriteAllText (outputFile, output, encoding); + } catch (IOException ex) { + AddError ("Could not write output file '" + outputFile + "':\n" + ex.ToString ()); + } + + return !errors.HasErrors; + } + + public bool PreprocessTemplate (string inputFileName, string className, string classNamespace, string inputContent, + out string language, out string[] references, out string outputContent) + { + errors.Clear (); + encoding = Encoding.UTF8; + + this.inputFile = inputFileName; + outputContent = Engine.PreprocessTemplate (inputContent, this, className, classNamespace, out language, out references); + + return !errors.HasErrors; + } + + CompilerError AddError (string error) + { + CompilerError err = new CompilerError (); + err.ErrorText = error; + Errors.Add (err); + return err; + } + + #region Virtual members + + public virtual object GetHostOption (string optionName) + { + return null; + } + + public virtual AppDomain ProvideTemplatingAppDomain (string content) + { + return null; + } + + //FIXME: implement + protected virtual string ResolveAssemblyReference (string assemblyReference) + { + //foreach (string referencePath in ReferencePaths) { + // + //} + return assemblyReference; + } + + protected virtual string ResolveParameterValue (string directiveId, string processorName, string parameterName) + { + var key = new ParameterKey (processorName, directiveId, parameterName); + string value; + if (parameters.TryGetValue (key, out value)) + return value; + if (processorName != null || directiveId != null) + return ResolveParameterValue (null, null, parameterName); + return null; + } + + protected virtual Type ResolveDirectiveProcessor (string processorName) + { + KeyValuePair value; + if (!directiveProcessors.TryGetValue (processorName, out value)) + throw new Exception (string.Format ("No directive processor registered as '{0}'", processorName)); + var asmPath = ResolveAssemblyReference (value.Value); + if (asmPath == null) + throw new Exception (string.Format ("Could not resolve assembly '{0}' for directive processor '{1}'", value.Value, processorName)); + var asm = System.Reflection.Assembly.LoadFrom (asmPath); + return asm.GetType (value.Key, true); + } + + protected virtual string ResolvePath (string path) + { + path = System.Environment.ExpandEnvironmentVariables (path); + if (Path.IsPathRooted (path)) + return path; + var dir = Path.GetDirectoryName (inputFile); + var test = Path.Combine (dir, path); + if (File.Exists (test)) + return test; + return null; + } + + #endregion + + Dictionary parameters = new Dictionary (); + Dictionary> directiveProcessors = new Dictionary> (); + + public void AddDirectiveProcessor (string name, string klass, string assembly) + { + directiveProcessors.Add (name, new KeyValuePair (klass,assembly)); + } + + public void AddParameter (string processorName, string directiveName, string parameterName, string value) + { + parameters.Add (new ParameterKey (processorName, directiveName, parameterName), value); + } + + protected virtual bool LoadIncludeText (string requestFileName, out string content, out string location) + { + content = ""; + location = ResolvePath (requestFileName); + + if (location == null) { + foreach (string path in includePaths) { + string f = Path.Combine (path, requestFileName); + if (File.Exists (f)) { + location = f; + break; + } + } + } + + if (location == null) + return false; + + try { + content = File.ReadAllText (location); + return true; + } catch (IOException ex) { + AddError ("Could not read included file '" + location + "':\n" + ex.ToString ()); + } + return false; + } + + #region Explicit ITextTemplatingEngineHost implementation + + bool ITextTemplatingEngineHost.LoadIncludeText (string requestFileName, out string content, out string location) + { + return LoadIncludeText (requestFileName, out content, out location); + } + + void ITextTemplatingEngineHost.LogErrors (CompilerErrorCollection errors) + { + this.errors.AddRange (errors); + } + + string ITextTemplatingEngineHost.ResolveAssemblyReference (string assemblyReference) + { + return ResolveAssemblyReference (assemblyReference); + } + + string ITextTemplatingEngineHost.ResolveParameterValue (string directiveId, string processorName, string parameterName) + { + return ResolveParameterValue (directiveId, processorName, parameterName); + } + + Type ITextTemplatingEngineHost.ResolveDirectiveProcessor (string processorName) + { + return ResolveDirectiveProcessor (processorName); + } + + string ITextTemplatingEngineHost.ResolvePath (string path) + { + return ResolvePath (path); + } + + void ITextTemplatingEngineHost.SetFileExtension (string extension) + { + extension = extension.TrimStart ('.'); + if (Path.HasExtension (outputFile)) { + outputFile = Path.ChangeExtension (outputFile, extension); + } else { + outputFile = outputFile + "." + extension; + } + } + + void ITextTemplatingEngineHost.SetOutputEncoding (System.Text.Encoding encoding, bool fromOutputDirective) + { + this.encoding = encoding; + } + + IList ITextTemplatingEngineHost.StandardAssemblyReferences { + get { return refs; } + } + + IList ITextTemplatingEngineHost.StandardImports { + get { return imports; } + } + + string ITextTemplatingEngineHost.TemplateFile { + get { return inputFile; } + } + + #endregion + + struct ParameterKey : IEquatable + { + public ParameterKey (string processorName, string directiveName, string parameterName) + { + this.processorName = processorName ?? ""; + this.directiveName = directiveName ?? ""; + this.parameterName = parameterName ?? ""; + unchecked { + hashCode = this.processorName.GetHashCode () + ^ this.directiveName.GetHashCode () + ^ this.parameterName.GetHashCode (); + } + } + + string processorName, directiveName, parameterName; + int hashCode; + + public override bool Equals (object obj) + { + return obj != null && obj is ParameterKey && Equals ((ParameterKey)obj); + } + + public bool Equals (ParameterKey other) + { + return processorName == other.processorName && directiveName == other.directiveName && parameterName == other.parameterName; + } + + public override int GetHashCode () + { + return hashCode; + } + } + } +} diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplateSettings.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplateSettings.cs new file mode 100644 index 00000000..8221c65e --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplateSettings.cs @@ -0,0 +1,75 @@ +// +// TemplateSettings.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2009 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. + +using System; +using System.Text; +using System.Collections.Generic; +using Microsoft.VisualStudio.TextTemplating; + +namespace Mono.TextTemplating +{ + + public class TemplateSettings + { + public TemplateSettings () + { + Imports = new HashSet (); + Assemblies = new HashSet (); + CustomDirectives = new List (); + DirectiveProcessors = new Dictionary (); + } + + public bool HostSpecific { get; set; } + public bool Debug { get; set; } + public string Inherits { get; set; } + public string Name { get; set; } + public string Namespace { get; set; } + public HashSet Imports { get; private set; } + public HashSet Assemblies { get; private set; } + public System.CodeDom.Compiler.CodeDomProvider Provider { get; set; } + public string Language { get; set; } + public string CompilerOptions { get; set; } + public Encoding Encoding { get; set; } + public string Extension { get; set; } + public System.Globalization.CultureInfo Culture { get; set; } + public List CustomDirectives { get; private set; } + public Dictionary DirectiveProcessors { get; private set; } + public bool IncludePreprocessingHelpers { get; set; } + public bool IsPreprocessed { get; set; } + } + + public class CustomDirective + { + public CustomDirective (string processorName, Directive directive) + { + this.ProcessorName = processorName; + this.Directive = directive; + } + + public string ProcessorName { get; set; } + public Directive Directive { get; set; } + } +} diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplatingEngine.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplatingEngine.cs new file mode 100644 index 00000000..5878adce --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/TemplatingEngine.cs @@ -0,0 +1,963 @@ +// +// Engine.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2009 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. + +using System; +using System.IO; +using System.Text; +using System.Collections.Generic; +using System.CodeDom; +using System.CodeDom.Compiler; +using Microsoft.CSharp; +using Microsoft.VisualStudio.TextTemplating; +using System.Linq; +using System.Reflection; + +namespace Mono.TextTemplating +{ + public class TemplatingEngine : MarshalByRefObject, Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngine + { + public string ProcessTemplate (string content, ITextTemplatingEngineHost host) + { + var tpl = CompileTemplate (content, host); + try { + if (tpl != null) + return tpl.Process (); + return null; + } finally { + if (tpl != null) + tpl.Dispose (); + } + } + + public string PreprocessTemplate (string content, ITextTemplatingEngineHost host, string className, + string classNamespace, out string language, out string[] references) + { + if (content == null) + throw new ArgumentNullException ("content"); + if (host == null) + throw new ArgumentNullException ("host"); + if (className == null) + throw new ArgumentNullException ("className"); + if (classNamespace == null) + throw new ArgumentNullException ("classNamespace"); + + language = null; + references = null; + + var pt = ParsedTemplate.FromText (content, host); + if (pt.Errors.HasErrors) { + host.LogErrors (pt.Errors); + return null; + } + + var settings = GetSettings (host, pt); + if (pt.Errors.HasErrors) { + host.LogErrors (pt.Errors); + return null; + } + settings.Name = className; + settings.Namespace = classNamespace; + settings.IncludePreprocessingHelpers = string.IsNullOrEmpty (settings.Inherits); + settings.IsPreprocessed = true; + language = settings.Language; + + var ccu = GenerateCompileUnit (host, content, pt, settings); + references = ProcessReferences (host, pt, settings).ToArray (); + + host.LogErrors (pt.Errors); + if (pt.Errors.HasErrors) { + return null; + } + + var options = new CodeGeneratorOptions (); + using (var sw = new StringWriter ()) { + settings.Provider.GenerateCodeFromCompileUnit (ccu, sw, options); + return sw.ToString (); + }; + } + + public CompiledTemplate CompileTemplate (string content, ITextTemplatingEngineHost host) + { + if (content == null) + throw new ArgumentNullException ("content"); + if (host == null) + throw new ArgumentNullException ("host"); + + var pt = ParsedTemplate.FromText (content, host); + if (pt.Errors.HasErrors) { + host.LogErrors (pt.Errors); + return null; + } + + var settings = GetSettings (host, pt); + if (pt.Errors.HasErrors) { + host.LogErrors (pt.Errors); + return null; + } + + if (!string.IsNullOrEmpty (settings.Extension)) { + host.SetFileExtension (settings.Extension); + } + if (settings.Encoding != null) { + //FIXME: when is this called with false? + host.SetOutputEncoding (settings.Encoding, true); + } + + var ccu = GenerateCompileUnit (host, content, pt, settings); + var references = ProcessReferences (host, pt, settings); + if (pt.Errors.HasErrors) { + host.LogErrors (pt.Errors); + return null; + } + + var results = GenerateCode (host, references, settings, ccu); + if (results.Errors.HasErrors) { + host.LogErrors (pt.Errors); + host.LogErrors (results.Errors); + return null; + } + + var templateClassFullName = settings.Namespace + "." + settings.Name; + var domain = host.ProvideTemplatingAppDomain (content); + if (domain != null) { + var type = typeof (CompiledTemplate); + var obj = domain.CreateInstanceAndUnwrap (type.Assembly.FullName, type.FullName, false, + BindingFlags.CreateInstance, null, + new object[] { host, results, templateClassFullName, settings.Culture, references.ToArray () }, + null, null); + return (CompiledTemplate) obj; + } else { + return new CompiledTemplate (host, results, templateClassFullName, settings.Culture, references.ToArray ()); + } + } + + static CompilerResults GenerateCode (ITextTemplatingEngineHost host, IEnumerable references, TemplateSettings settings, CodeCompileUnit ccu) + { + var pars = new CompilerParameters () { + GenerateExecutable = false, + CompilerOptions = settings.CompilerOptions, + IncludeDebugInformation = settings.Debug, + GenerateInMemory = false, + }; + + foreach (var r in references) + pars.ReferencedAssemblies.Add (r); + + if (settings.Debug) + pars.TempFiles.KeepFiles = true; + + return settings.Provider.CompileAssemblyFromDom (pars, ccu); + } + + static HashSet ProcessReferences (ITextTemplatingEngineHost host, ParsedTemplate pt, TemplateSettings settings) + { + var resolved = new HashSet (); + + foreach (string assem in settings.Assemblies.Union (host.StandardAssemblyReferences)) { + if (resolved.Contains (assem)) + continue; + + string resolvedAssem = host.ResolveAssemblyReference (assem); + if (!string.IsNullOrEmpty (resolvedAssem)) { + resolved.Add (resolvedAssem); + } else { + pt.LogError ("Could not resolve assembly reference '" + assem + "'"); + return null; + } + } + return resolved; + } + + public static TemplateSettings GetSettings (ITextTemplatingEngineHost host, ParsedTemplate pt) + { + var settings = new TemplateSettings (); + + foreach (Directive dt in pt.Directives) { + switch (dt.Name) { + case "template": + string val = dt.Extract ("language"); + if (val != null) + settings.Language = val; + val = dt.Extract ("debug"); + if (val != null) + settings.Debug = string.Compare (val, "true", StringComparison.OrdinalIgnoreCase) == 0; + val = dt.Extract ("inherits"); + if (val != null) + settings.Inherits = val; + val = dt.Extract ("culture"); + if (val != null) { + System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.GetCultureInfo (val); + if (culture == null) + pt.LogWarning ("Could not find culture '" + val + "'", dt.StartLocation); + else + settings.Culture = culture; + } + val = dt.Extract ("hostspecific"); + if (val != null) { + settings.HostSpecific = string.Compare (val, "true", StringComparison.OrdinalIgnoreCase) == 0; + } + val = dt.Extract ("CompilerOptions"); + if (val != null) { + settings.CompilerOptions = val; + } + break; + + case "assembly": + string name = dt.Extract ("name"); + if (name == null) + pt.LogError ("Missing name attribute in assembly directive", dt.StartLocation); + else + settings.Assemblies.Add (name); + break; + + case "import": + string namespac = dt.Extract ("namespace"); + if (namespac == null) + pt.LogError ("Missing namespace attribute in import directive", dt.StartLocation); + else + settings.Imports.Add (namespac); + break; + + case "output": + settings.Extension = dt.Extract ("extension"); + string encoding = dt.Extract ("encoding"); + if (encoding != null) + settings.Encoding = Encoding.GetEncoding (encoding); + break; + + case "include": + throw new InvalidOperationException ("Include is handled in the parser"); + + case "parameter": + AddDirective (settings, host, "ParameterDirectiveProcessor", dt); + continue; + + default: + string processorName = dt.Extract ("Processor"); + if (processorName == null) + throw new InvalidOperationException ("Custom directive '" + dt.Name + "' does not specify a processor"); + + AddDirective (settings, host, processorName, dt); + continue; + } + ComplainExcessAttributes (dt, pt); + } + + //initialize the custom processors + foreach (var kv in settings.DirectiveProcessors) { + kv.Value.Initialize (host); + var hs = kv.Value as IRecognizeHostSpecific; + if (hs == null) + continue; + if (hs.RequiresProcessingRunIsHostSpecific && !settings.HostSpecific) { + settings.HostSpecific = true; + pt.LogWarning ("Directive processor '" + kv.Key + "' requires hostspecific=true, forcing on."); + } + hs.SetProcessingRunIsHostSpecific (settings.HostSpecific); + } + + if (settings.Name == null) + settings.Name = string.Format ("GeneratedTextTransformation{0:x}", new System.Random ().Next ()); + if (settings.Namespace == null) + settings.Namespace = typeof (TextTransformation).Namespace; + + //resolve the CodeDOM provider + if (String.IsNullOrEmpty (settings.Language)) { + pt.LogError ("No language was specified for the template"); + return settings; + } + + if (settings.Language == "C#v3.5") { + Dictionary providerOptions = new Dictionary (); + providerOptions.Add ("CompilerVersion", "v3.5"); + settings.Provider = new CSharpCodeProvider (providerOptions); + } + else { + settings.Provider = CodeDomProvider.CreateProvider (settings.Language); + } + + if (settings.Provider == null) { + pt.LogError ("A provider could not be found for the language '" + settings.Language + "'"); + return settings; + } + + return settings; + } + + public static string IndentSnippetText (string text, string indent) + { + var builder = new StringBuilder (text.Length); + builder.Append (indent); + int lastNewline = 0; + for (int i = 0; i < text.Length - 1; i++) { + char c = text[i]; + if (c == '\r') { + if (text[i + 1] == '\n') { + i++; + if (i == text.Length - 1) + break; + } + } else if (c != '\n') { + continue; + } + i++; + int len = i - lastNewline; + if (len > 0) { + builder.Append (text, lastNewline, i - lastNewline); + } + builder.Append (indent); + lastNewline = i; + } + if (lastNewline > 0) + builder.Append (text, lastNewline, text.Length - lastNewline); + else + builder.Append (text); + return builder.ToString (); + } + + static void AddDirective (TemplateSettings settings, ITextTemplatingEngineHost host, string processorName, Directive directive) + { + DirectiveProcessor processor; + if (!settings.DirectiveProcessors.TryGetValue (processorName, out processor)) { + switch (processorName) { + case "ParameterDirectiveProcessor": + processor = new ParameterDirectiveProcessor (); + break; + default: + Type processorType = host.ResolveDirectiveProcessor (processorName); + processor = (DirectiveProcessor) Activator.CreateInstance (processorType); + break; + } + if (!processor.IsDirectiveSupported (directive.Name)) + throw new InvalidOperationException ("Directive processor '" + processorName + "' does not support directive '" + directive.Name + "'"); + + settings.DirectiveProcessors [processorName] = processor; + } + settings.CustomDirectives.Add (new CustomDirective (processorName, directive)); + } + + static bool ComplainExcessAttributes (Directive dt, ParsedTemplate pt) + { + if (dt.Attributes.Count == 0) + return false; + StringBuilder sb = new StringBuilder ("Unknown attributes "); + bool first = true; + foreach (string key in dt.Attributes.Keys) { + if (!first) { + sb.Append (", "); + } else { + first = false; + } + sb.Append (key); + } + sb.Append (" found in "); + sb.Append (dt.Name); + sb.Append (" directive."); + pt.LogWarning (sb.ToString (), dt.StartLocation); + return false; + } + + static void ProcessDirectives (ITextTemplatingEngineHost host, string content, ParsedTemplate pt, TemplateSettings settings) + { + foreach (var processor in settings.DirectiveProcessors.Values) { + processor.StartProcessingRun (settings.Provider, content, pt.Errors); + } + + foreach (var dt in settings.CustomDirectives) { + var processor = settings.DirectiveProcessors[dt.ProcessorName]; + + if (processor is RequiresProvidesDirectiveProcessor) + throw new NotImplementedException ("RequiresProvidesDirectiveProcessor"); + + processor.ProcessDirective (dt.Directive.Name, dt.Directive.Attributes); + } + + foreach (var processor in settings.DirectiveProcessors.Values) { + processor.FinishProcessingRun (); + + var imports = processor.GetImportsForProcessingRun (); + if (imports != null) + settings.Imports.UnionWith (imports); + var references = processor.GetReferencesForProcessingRun (); + if (references != null) + settings.Assemblies.UnionWith (references); + } + } + + public static CodeCompileUnit GenerateCompileUnit (ITextTemplatingEngineHost host, string content, ParsedTemplate pt, TemplateSettings settings) + { + ProcessDirectives (host, content, pt, settings); + + //prep the compile unit + var ccu = new CodeCompileUnit (); + var namespac = new CodeNamespace (settings.Namespace); + ccu.Namespaces.Add (namespac); + + foreach (string ns in settings.Imports.Union (host.StandardImports)) + namespac.Imports.Add (new CodeNamespaceImport (ns)); + + //prep the type + var type = new CodeTypeDeclaration (settings.Name); + type.IsPartial = true; + if (!string.IsNullOrEmpty (settings.Inherits)) { + type.BaseTypes.Add (new CodeTypeReference (settings.Inherits)); + } else if (!settings.IncludePreprocessingHelpers) { + type.BaseTypes.Add (TypeRef ()); + } else { + type.BaseTypes.Add (new CodeTypeReference (settings.Name + "Base")); + } + namespac.Types.Add (type); + + //prep the transform method + var transformMeth = new CodeMemberMethod () { + Name = "TransformText", + ReturnType = new CodeTypeReference (typeof (String)), + Attributes = MemberAttributes.Public, + }; + if (!settings.IncludePreprocessingHelpers) + transformMeth.Attributes |= MemberAttributes.Override; + + transformMeth.Statements.Add (new CodeAssignStatement ( + new CodePropertyReferenceExpression (new CodeThisReferenceExpression (), "GenerationEnvironment"), + new CodePrimitiveExpression (null))); + + CodeExpression toStringHelper; + if (settings.IsPreprocessed) { + toStringHelper = new CodePropertyReferenceExpression (new CodeThisReferenceExpression (), "ToStringHelper"); + } else { + toStringHelper = new CodeTypeReferenceExpression ( + new CodeTypeReference (typeof (ToStringHelper), CodeTypeReferenceOptions.GlobalReference)); + } + + //method references that will need to be used multiple times + var writeMeth = new CodeMethodReferenceExpression (new CodeThisReferenceExpression (), "Write"); + var toStringMeth = new CodeMethodReferenceExpression (toStringHelper, "ToStringWithCulture"); + bool helperMode = false; + + //build the code from the segments + foreach (TemplateSegment seg in pt.Content) { + CodeStatement st = null; + var location = new CodeLinePragma (seg.StartLocation.FileName ?? host.TemplateFile, seg.StartLocation.Line); + switch (seg.Type) { + case SegmentType.Block: + if (helperMode) + //TODO: are blocks permitted after helpers? + throw new ParserException ("Blocks are not permitted after helpers", seg.StartLocation); + st = new CodeSnippetStatement (seg.Text); + break; + case SegmentType.Expression: + st = new CodeExpressionStatement ( + new CodeMethodInvokeExpression (writeMeth, + new CodeMethodInvokeExpression (toStringMeth, new CodeSnippetExpression (seg.Text)))); + break; + case SegmentType.Content: + st = new CodeExpressionStatement (new CodeMethodInvokeExpression (writeMeth, new CodePrimitiveExpression (seg.Text))); + break; + case SegmentType.Helper: + type.Members.Add (new CodeSnippetTypeMember (seg.Text) { LinePragma = location }); + helperMode = true; + break; + default: + throw new InvalidOperationException (); + } + if (st != null) { + if (helperMode) { + //convert the statement into a snippet member and attach it to the top level type + //TODO: is there a way to do this for languages that use indentation for blocks, e.g. python? + using (var writer = new StringWriter ()) { + settings.Provider.GenerateCodeFromStatement (st, writer, null); + type.Members.Add (new CodeSnippetTypeMember (writer.ToString ()) { LinePragma = location }); + } + } else { + st.LinePragma = location; + transformMeth.Statements.Add (st); + continue; + } + } + } + + //complete the transform method + transformMeth.Statements.Add (new CodeMethodReturnStatement ( + new CodeMethodInvokeExpression ( + new CodePropertyReferenceExpression ( + new CodeThisReferenceExpression (), + "GenerationEnvironment"), + "ToString"))); + type.Members.Add (transformMeth); + + //class code from processors + foreach (var processor in settings.DirectiveProcessors.Values) { + string classCode = processor.GetClassCodeForProcessingRun (); + if (classCode != null) + type.Members.Add (new CodeSnippetTypeMember (classCode)); + } + + //generate the Host property if needed + if (settings.HostSpecific) { + GenerateHostProperty (type, settings); + } + + GenerateInitializationMethod (type, settings); + + if (settings.IncludePreprocessingHelpers) { + var baseClass = new CodeTypeDeclaration (settings.Name + "Base"); + GenerateProcessingHelpers (baseClass, settings); + AddToStringHelper (baseClass, settings); + namespac.Types.Add (baseClass); + } + return ccu; + } + + static void GenerateHostProperty (CodeTypeDeclaration type, TemplateSettings settings) + { + var hostField = new CodeMemberField (TypeRef (), "hostValue"); + hostField.Attributes = (hostField.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Private; + type.Members.Add (hostField); + + var hostProp = GenerateGetterSetterProperty ("Host", hostField); + hostProp.Attributes = MemberAttributes.Public | MemberAttributes.Final; + type.Members.Add (hostProp); + } + + static void GenerateInitializationMethod (CodeTypeDeclaration type, TemplateSettings settings) + { + //initialization method + var initializeMeth = new CodeMemberMethod () { + Name = "Initialize", + ReturnType = new CodeTypeReference (typeof (void), CodeTypeReferenceOptions.GlobalReference), + Attributes = MemberAttributes.Family + }; + if (!settings.IncludePreprocessingHelpers) + initializeMeth.Attributes |= MemberAttributes.Override; + + //pre-init code from processors + foreach (var processor in settings.DirectiveProcessors.Values) { + string code = processor.GetPreInitializationCodeForProcessingRun (); + if (code != null) + initializeMeth.Statements.Add (new CodeSnippetStatement (code)); + } + + //base call + if (!settings.IncludePreprocessingHelpers) { + initializeMeth.Statements.Add ( + new CodeMethodInvokeExpression ( + new CodeMethodReferenceExpression ( + new CodeBaseReferenceExpression (), + "Initialize"))); + } + + //post-init code from processors + foreach (var processor in settings.DirectiveProcessors.Values) { + string code = processor.GetPostInitializationCodeForProcessingRun (); + if (code != null) + initializeMeth.Statements.Add (new CodeSnippetStatement (code)); + } + + type.Members.Add (initializeMeth); + } + + static void GenerateProcessingHelpers (CodeTypeDeclaration type, TemplateSettings settings) + { + var thisRef = new CodeThisReferenceExpression (); + var sbTypeRef = TypeRef (); + + var sessionField = PrivateField (TypeRef> (), "session"); + var sessionProp = GenerateGetterSetterProperty ("Session", sessionField); + sessionProp.Attributes = MemberAttributes.Public; + + var builderField = PrivateField (sbTypeRef, "builder"); + var builderFieldRef = new CodeFieldReferenceExpression (thisRef, builderField.Name); + + var generationEnvironmentProp = GenerateGetterSetterProperty ("GenerationEnvironment", builderField); + AddPropertyGetterInitializationIfFieldIsNull (generationEnvironmentProp, builderFieldRef, TypeRef ()); + + type.Members.Add (builderField); + type.Members.Add (sessionField); + type.Members.Add (sessionProp); + type.Members.Add (generationEnvironmentProp); + + AddErrorHelpers (type, settings); + AddIndentHelpers (type, settings); + AddWriteHelpers (type, settings); + } + + static void AddPropertyGetterInitializationIfFieldIsNull (CodeMemberProperty property, CodeFieldReferenceExpression fieldRef, CodeTypeReference typeRef) + { + var fieldInit = FieldInitializationIfNull (fieldRef, typeRef); + property.GetStatements.Insert (0, fieldInit); + } + + static CodeConditionStatement FieldInitializationIfNull (CodeFieldReferenceExpression fieldRef, CodeTypeReference typeRef) + { + return new CodeConditionStatement ( + new CodeBinaryOperatorExpression (fieldRef, + CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (null)), + new CodeAssignStatement (fieldRef, new CodeObjectCreateExpression (typeRef))); + } + + static void AddErrorHelpers (CodeTypeDeclaration type, TemplateSettings settings) + { + var cecTypeRef = TypeRef (); + var thisRef = new CodeThisReferenceExpression (); + var stringTypeRef = TypeRef (); + var nullPrim = new CodePrimitiveExpression (null); + var minusOnePrim = new CodePrimitiveExpression (-1); + + var errorsField = PrivateField (cecTypeRef, "errors"); + var errorsFieldRef = new CodeFieldReferenceExpression (thisRef, errorsField.Name); + + var errorsProp = GenerateGetterProperty ("Errors", errorsField); + errorsProp.Attributes = MemberAttributes.Family | MemberAttributes.Final; + errorsProp.GetStatements.Insert (0, FieldInitializationIfNull (errorsFieldRef, TypeRef())); + + var errorsPropRef = new CodePropertyReferenceExpression (new CodeThisReferenceExpression (), "Errors"); + + var compilerErrorTypeRef = TypeRef (); + var errorMeth = new CodeMemberMethod () { + Name = "Error", + Attributes = MemberAttributes.Public | MemberAttributes.Final, + }; + errorMeth.Parameters.Add (new CodeParameterDeclarationExpression (stringTypeRef, "message")); + errorMeth.Statements.Add (new CodeMethodInvokeExpression (errorsPropRef, "Add", + new CodeObjectCreateExpression (compilerErrorTypeRef, nullPrim, minusOnePrim, minusOnePrim, nullPrim, + new CodeArgumentReferenceExpression ("message")))); + + var warningMeth = new CodeMemberMethod () { + Name = "Warning", + Attributes = MemberAttributes.Public | MemberAttributes.Final, + }; + warningMeth.Parameters.Add (new CodeParameterDeclarationExpression (stringTypeRef, "message")); + warningMeth.Statements.Add (new CodeVariableDeclarationStatement (compilerErrorTypeRef, "val", + new CodeObjectCreateExpression (compilerErrorTypeRef, nullPrim, minusOnePrim, minusOnePrim, nullPrim, + new CodeArgumentReferenceExpression ("message")))); + warningMeth.Statements.Add (new CodeAssignStatement (new CodePropertyReferenceExpression ( + new CodeVariableReferenceExpression ("val"), "IsWarning"), new CodePrimitiveExpression (true))); + warningMeth.Statements.Add (new CodeMethodInvokeExpression (errorsPropRef, "Add", + new CodeVariableReferenceExpression ("val"))); + + type.Members.Add (errorsField); + type.Members.Add (errorMeth); + type.Members.Add (warningMeth); + type.Members.Add (errorsProp); + } + + static void AddIndentHelpers (CodeTypeDeclaration type, TemplateSettings settings) + { + var stringTypeRef = TypeRef (); + var thisRef = new CodeThisReferenceExpression (); + var zeroPrim = new CodePrimitiveExpression (0); + var stringEmptyRef = new CodeFieldReferenceExpression (new CodeTypeReferenceExpression (stringTypeRef), "Empty"); + var intTypeRef = TypeRef (); + var stackIntTypeRef = TypeRef> (); + + var indentsField = PrivateField (stackIntTypeRef, "indents"); + var indentsFieldRef = new CodeFieldReferenceExpression (thisRef, indentsField.Name); + + var indentsProp = GenerateGetterProperty ("Indents", indentsField); + indentsProp.Attributes = MemberAttributes.Private; + AddPropertyGetterInitializationIfFieldIsNull (indentsProp, indentsFieldRef, TypeRef> ()); + + var indentsPropRef = new CodeFieldReferenceExpression (thisRef, indentsProp.Name); + + var currentIndentField = PrivateField (stringTypeRef, "currentIndent"); + currentIndentField.InitExpression = stringEmptyRef; + var currentIndentFieldRef = new CodeFieldReferenceExpression (thisRef, currentIndentField.Name); + + var popIndentMeth = new CodeMemberMethod () { + Name = "PopIndent", + ReturnType = stringTypeRef, + Attributes = MemberAttributes.Public | MemberAttributes.Final, + }; + popIndentMeth.Statements.Add (new CodeConditionStatement ( + new CodeBinaryOperatorExpression (new CodePropertyReferenceExpression (indentsPropRef, "Count"), + CodeBinaryOperatorType.ValueEquality, zeroPrim), + new CodeMethodReturnStatement (stringEmptyRef))); + popIndentMeth.Statements.Add (new CodeVariableDeclarationStatement (intTypeRef, "lastPos", + new CodeBinaryOperatorExpression ( + new CodePropertyReferenceExpression (currentIndentFieldRef, "Length"), + CodeBinaryOperatorType.Subtract, + new CodeMethodInvokeExpression (indentsPropRef, "Pop")))); + popIndentMeth.Statements.Add (new CodeVariableDeclarationStatement (stringTypeRef, "last", + new CodeMethodInvokeExpression (currentIndentFieldRef, "Substring", new CodeVariableReferenceExpression ("lastPos")))); + popIndentMeth.Statements.Add (new CodeAssignStatement (currentIndentFieldRef, + new CodeMethodInvokeExpression (currentIndentFieldRef, "Substring", zeroPrim, new CodeVariableReferenceExpression ("lastPos")))); + popIndentMeth.Statements.Add (new CodeMethodReturnStatement (new CodeVariableReferenceExpression ("last"))); + + var pushIndentMeth = new CodeMemberMethod () { + Name = "PushIndent", + Attributes = MemberAttributes.Public | MemberAttributes.Final, + }; + pushIndentMeth.Parameters.Add (new CodeParameterDeclarationExpression (stringTypeRef, "indent")); + pushIndentMeth.Statements.Add (new CodeMethodInvokeExpression (indentsPropRef, "Push", + new CodePropertyReferenceExpression (new CodeArgumentReferenceExpression ("indent"), "Length"))); + pushIndentMeth.Statements.Add (new CodeAssignStatement (currentIndentFieldRef, + new CodeBinaryOperatorExpression (currentIndentFieldRef, CodeBinaryOperatorType.Add, new CodeArgumentReferenceExpression ("indent")))); + + var clearIndentMeth = new CodeMemberMethod () { + Name = "ClearIndent", + Attributes = MemberAttributes.Public | MemberAttributes.Final, + }; + clearIndentMeth.Statements.Add (new CodeAssignStatement (currentIndentFieldRef, stringEmptyRef)); + clearIndentMeth.Statements.Add (new CodeMethodInvokeExpression (indentsPropRef, "Clear")); + + var currentIndentProp = GenerateGetterProperty ("CurrentIndent", currentIndentField); + type.Members.Add (currentIndentField); + type.Members.Add (indentsField); + type.Members.Add (popIndentMeth); + type.Members.Add (pushIndentMeth); + type.Members.Add (clearIndentMeth); + type.Members.Add (currentIndentProp); + type.Members.Add (indentsProp); + } + + static void AddWriteHelpers (CodeTypeDeclaration type, TemplateSettings settings) + { + var stringTypeRef = TypeRef (); + var thisRef = new CodeThisReferenceExpression (); + var genEnvPropRef = new CodePropertyReferenceExpression (thisRef, "GenerationEnvironment"); + var currentIndentFieldRef = new CodeFieldReferenceExpression (thisRef, "currentIndent"); + + var textToAppendParam = new CodeParameterDeclarationExpression (stringTypeRef, "textToAppend"); + var formatParam = new CodeParameterDeclarationExpression (stringTypeRef, "format"); + var argsParam = new CodeParameterDeclarationExpression (TypeRef (), "args"); + argsParam.CustomAttributes.Add (new CodeAttributeDeclaration (TypeRef ())); + + var textToAppendParamRef = new CodeArgumentReferenceExpression ("textToAppend"); + var formatParamRef = new CodeArgumentReferenceExpression ("format"); + var argsParamRef = new CodeArgumentReferenceExpression ("args"); + + var writeMeth = new CodeMemberMethod () { + Name = "Write", + Attributes = MemberAttributes.Public | MemberAttributes.Final, + }; + writeMeth.Parameters.Add (textToAppendParam); + writeMeth.Statements.Add (new CodeMethodInvokeExpression (genEnvPropRef, "Append", new CodeArgumentReferenceExpression ("textToAppend"))); + + var writeArgsMeth = new CodeMemberMethod () { + Name = "Write", + Attributes = MemberAttributes.Public | MemberAttributes.Final, + }; + writeArgsMeth.Parameters.Add (formatParam); + writeArgsMeth.Parameters.Add (argsParam); + writeArgsMeth.Statements.Add (new CodeMethodInvokeExpression (genEnvPropRef, "AppendFormat", formatParamRef, argsParamRef)); + + var writeLineMeth = new CodeMemberMethod () { + Name = "WriteLine", + Attributes = MemberAttributes.Public | MemberAttributes.Final, + }; + writeLineMeth.Parameters.Add (textToAppendParam); + writeLineMeth.Statements.Add (new CodeMethodInvokeExpression (genEnvPropRef, "Append", currentIndentFieldRef)); + writeLineMeth.Statements.Add (new CodeMethodInvokeExpression (genEnvPropRef, "AppendLine", textToAppendParamRef)); + + var writeLineArgsMeth = new CodeMemberMethod () { + Name = "WriteLine", + Attributes = MemberAttributes.Public | MemberAttributes.Final, + }; + writeLineArgsMeth.Parameters.Add (formatParam); + writeLineArgsMeth.Parameters.Add (argsParam); + writeLineArgsMeth.Statements.Add (new CodeMethodInvokeExpression (genEnvPropRef, "Append", currentIndentFieldRef)); + writeLineArgsMeth.Statements.Add (new CodeMethodInvokeExpression (genEnvPropRef, "AppendFormat", formatParamRef, argsParamRef)); + writeLineArgsMeth.Statements.Add (new CodeMethodInvokeExpression (genEnvPropRef, "AppendLine")); + + type.Members.Add (writeMeth); + type.Members.Add (writeArgsMeth); + type.Members.Add (writeLineMeth); + type.Members.Add (writeLineArgsMeth); + } + + static void AddToStringHelper (CodeTypeDeclaration type, TemplateSettings settings) + { + var helperCls = new CodeTypeDeclaration ("ToStringInstanceHelper") { + IsClass = true, + TypeAttributes = System.Reflection.TypeAttributes.NestedPublic, + }; + + var formatProviderField = PrivateField (TypeRef (), "formatProvider"); + formatProviderField.InitExpression = new CodePropertyReferenceExpression ( + new CodeTypeReferenceExpression (TypeRef ()), "InvariantCulture"); + var formatProviderFieldRef = new CodeFieldReferenceExpression (new CodeThisReferenceExpression (), formatProviderField.Name); + + var formatProviderProp = GenerateGetterSetterProperty ("FormatProvider", formatProviderField); + AddSetterNullCheck (formatProviderProp, formatProviderFieldRef); + + helperCls.Members.Add (formatProviderField); + helperCls.Members.Add (formatProviderProp); + + var meth = new CodeMemberMethod () { + Name = "ToStringWithCulture", + Attributes = MemberAttributes.Public | MemberAttributes.Final, + ReturnType = TypeRef (), + }; + meth.Parameters.Add (new CodeParameterDeclarationExpression (TypeRef (), "objectToConvert")); + var paramRef = new CodeArgumentReferenceExpression ("objectToConvert"); + + meth.Statements.Add (NullCheck (paramRef, paramRef.ParameterName)); + + var typeLocal = new CodeVariableDeclarationStatement (TypeRef (), "type", new CodeMethodInvokeExpression (paramRef, "GetType")); + var typeLocalRef = new CodeVariableReferenceExpression (typeLocal.Name); + meth.Statements.Add (typeLocal); + + var iConvertibleTypeLocal = new CodeVariableDeclarationStatement (TypeRef (), "iConvertibleType", + new CodeTypeOfExpression (TypeRef ())); + var iConvertibleTypeLocalRef = new CodeVariableReferenceExpression (iConvertibleTypeLocal.Name); + meth.Statements.Add (iConvertibleTypeLocal); + + meth.Statements.Add (new CodeConditionStatement ( + new CodeMethodInvokeExpression (iConvertibleTypeLocalRef, "IsAssignableFrom", typeLocalRef), + new CodeMethodReturnStatement (new CodeMethodInvokeExpression ( + new CodeCastExpression (TypeRef (), paramRef), "ToString", formatProviderFieldRef)))); + + var methInfoLocal = new CodeVariableDeclarationStatement (TypeRef (), "methInfo", + new CodeMethodInvokeExpression (typeLocalRef, "GetMethod", + new CodePrimitiveExpression ("ToString"), + new CodeArrayCreateExpression (TypeRef (), new CodeExpression [] { iConvertibleTypeLocalRef }))); + meth.Statements.Add (methInfoLocal); + var methInfoLocalRef = new CodeVariableReferenceExpression (methInfoLocal.Name); + meth.Statements.Add (new CodeConditionStatement (NotNull (methInfoLocalRef), + new CodeMethodReturnStatement (new CodeCastExpression (TypeRef (), + new CodeMethodInvokeExpression ( + methInfoLocalRef, "Invoke", paramRef, + new CodeArrayCreateExpression (TypeRef (), new CodeExpression [] { formatProviderFieldRef } )))))); + + meth.Statements.Add (new CodeMethodReturnStatement (new CodeMethodInvokeExpression (paramRef, "ToString"))); + + helperCls.Members.Add (meth); + + + var helperFieldName = settings.Provider.CreateValidIdentifier ("_toStringHelper"); + var helperField = PrivateField (new CodeTypeReference (helperCls.Name), helperFieldName); + helperField.InitExpression = new CodeObjectCreateExpression (helperField.Type); + type.Members.Add (helperField); + type.Members.Add (GenerateGetterProperty ("ToStringHelper", helperField)); + type.Members.Add (helperCls); + } + + #region CodeDom helpers + + static CodeTypeReference TypeRef () + { + return new CodeTypeReference (typeof (T), CodeTypeReferenceOptions.GlobalReference); + } + + static CodeMemberProperty GenerateGetterSetterProperty (string propertyName, CodeMemberField field) + { + var prop = new CodeMemberProperty () { + Name = propertyName, + Attributes = MemberAttributes.Public | MemberAttributes.Final, + Type = field.Type + }; + var fieldRef = new CodeFieldReferenceExpression (new CodeThisReferenceExpression (), field.Name); + AddGetter (prop, fieldRef); + AddSetter (prop, fieldRef); + return prop; + } + + static CodeMemberProperty GenerateGetterProperty (string propertyName, CodeMemberField field) + { + var prop = new CodeMemberProperty () { + Name = propertyName, + Attributes = MemberAttributes.Public | MemberAttributes.Final, + HasSet = false, + Type = field.Type + }; + var fieldRef = new CodeFieldReferenceExpression (new CodeThisReferenceExpression (), field.Name); + AddGetter (prop, fieldRef); + return prop; + } + + static void AddSetter (CodeMemberProperty property, CodeFieldReferenceExpression fieldRef) + { + property.HasSet = true; + property.SetStatements.Add (new CodeAssignStatement (fieldRef, new CodePropertySetValueReferenceExpression ())); + } + + static void AddGetter (CodeMemberProperty property, CodeFieldReferenceExpression fieldRef) + { + property.HasGet = true; + property.GetStatements.Add (new CodeMethodReturnStatement (fieldRef)); + } + + static void MakeGetterLazy (CodeMemberProperty property, CodeFieldReferenceExpression fieldRef, CodeExpression initExpression) + { + property.GetStatements.Insert (0, new CodeConditionStatement ( + NotNull (fieldRef), + new CodeAssignStatement (fieldRef, initExpression)) + ); + } + + static void AddSetterNullCheck (CodeMemberProperty property, CodeFieldReferenceExpression fieldRef) + { + property.SetStatements.Insert (0, NullCheck (fieldRef, fieldRef.FieldName)); + } + + static CodeStatement NullCheck (CodeExpression expr, string exceptionMessage) + { + return new CodeConditionStatement ( + IsNull (expr), + new CodeThrowExceptionStatement (new CodeObjectCreateExpression ( + new CodeTypeReference (typeof (ArgumentNullException), CodeTypeReferenceOptions.GlobalReference), + new CodePrimitiveExpression (exceptionMessage))) + ); + } + + static CodeBinaryOperatorExpression NotNull (CodeExpression reference) + { + return new CodeBinaryOperatorExpression (reference, CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression (null)); + } + + static CodeBinaryOperatorExpression IsNull (CodeExpression reference) + { + return new CodeBinaryOperatorExpression (reference, CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (null)); + } + + static CodeBinaryOperatorExpression IsFalse (CodeExpression expr) + { + return new CodeBinaryOperatorExpression (expr, CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (false)); + } + + static CodeBinaryOperatorExpression BooleanAnd (CodeExpression expr1, CodeExpression expr2) + { + return new CodeBinaryOperatorExpression (expr1, CodeBinaryOperatorType.BooleanAnd, expr2); + } + + static CodeStatement ArgNullCheck (CodeExpression value, params CodeExpression[] argNullExcArgs) + { + return new CodeConditionStatement ( + new CodeBinaryOperatorExpression (value, + CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression (null)), + new CodeThrowExceptionStatement (new CodeObjectCreateExpression (typeof (ArgumentNullException), argNullExcArgs))); + } + + static CodeMemberField PrivateField (CodeTypeReference typeRef, string name) + { + return new CodeMemberField (typeRef, name) { + Attributes = MemberAttributes.Private + }; + } + + #endregion + } +} diff --git a/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/Tokeniser.cs b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/Tokeniser.cs new file mode 100644 index 00000000..9da2d4cd --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/Mono.TextTemplating/Mono.TextTemplating/Tokeniser.cs @@ -0,0 +1,295 @@ +// +// Tokeniser.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2009 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. + +using System; +using System.IO; +using System.Diagnostics; + +namespace Mono.TextTemplating +{ + + public class Tokeniser + { + string content; + int position = 0; + string value; + State nextState = State.Content; + Location nextStateLocation; + Location nextStateTagStartLocation; + + public Tokeniser (string fileName, string content) + { + State = State.Content; + this.content = content; + this.Location = this.nextStateLocation = this.nextStateTagStartLocation = new Location (fileName, 1, 1); + } + + public bool Advance () + { + value = null; + State = nextState; + Location = nextStateLocation; + TagStartLocation = nextStateTagStartLocation; + if (nextState == State.EOF) + return false; + nextState = GetNextStateAndCurrentValue (); + return true; + } + + State GetNextStateAndCurrentValue () + { + switch (State) { + case State.Block: + case State.Expression: + case State.Helper: + return GetBlockEnd (); + + case State.Directive: + return NextStateInDirective (); + + case State.Content: + return NextStateInContent (); + + case State.DirectiveName: + return GetDirectiveName (); + + case State.DirectiveValue: + return GetDirectiveValue (); + + default: + throw new InvalidOperationException ("Unexpected state '" + State.ToString () + "'"); + } + } + + State GetBlockEnd () + { + int start = position; + for (; position < content.Length; position++) { + char c = content[position]; + nextStateTagStartLocation = nextStateLocation; + nextStateLocation = nextStateLocation.AddCol (); + if (c == '\r') { + if (position + 1 < content.Length && content[position + 1] == '\n') + position++; + nextStateLocation = nextStateLocation.AddLine(); + } else if (c == '\n') { + nextStateLocation = nextStateLocation.AddLine(); + } else if (c =='>' && content[position-1] == '#' && content[position-2] != '\\') { + value = content.Substring (start, position - start - 1); + position++; + TagEndLocation = nextStateLocation; + + //skip newlines directly after blocks, unless they're expressions + if (State != State.Expression && (position += IsNewLine()) > 0) { + nextStateLocation = nextStateLocation.AddLine (); + } + return State.Content; + } + } + throw new ParserException ("Unexpected end of file.", nextStateLocation); + } + + State GetDirectiveName () + { + int start = position; + for (; position < content.Length; position++) { + char c = content[position]; + if (!Char.IsLetterOrDigit (c)) { + value = content.Substring (start, position - start); + return State.Directive; + } else { + nextStateLocation = nextStateLocation.AddCol (); + } + } + throw new ParserException ("Unexpected end of file.", nextStateLocation); + } + + State GetDirectiveValue () + { + int start = position; + int delimiter = '\0'; + for (; position < content.Length; position++) { + char c = content[position]; + nextStateLocation = nextStateLocation.AddCol (); + if (c == '\r') { + if (position + 1 < content.Length && content[position + 1] == '\n') + position++; + nextStateLocation = nextStateLocation.AddLine(); + } else if (c == '\n') + nextStateLocation = nextStateLocation.AddLine(); + if (delimiter == '\0') { + if (c == '\'' || c == '"') { + start = position; + delimiter = c; + } else if (!Char.IsWhiteSpace (c)) { + throw new ParserException ("Unexpected character '" + c + "'. Expecting attribute value.", nextStateLocation); + } + continue; + } + if (c == delimiter) { + value = content.Substring (start + 1, position - start - 1); + position++; + return State.Directive; + } + } + throw new ParserException ("Unexpected end of file.", nextStateLocation);; + } + + State NextStateInContent () + { + int start = position; + for (; position < content.Length; position++) { + char c = content[position]; + nextStateTagStartLocation = nextStateLocation; + nextStateLocation = nextStateLocation.AddCol (); + if (c == '\r') { + if (position + 1 < content.Length && content[position + 1] == '\n') + position++; + nextStateLocation = nextStateLocation.AddLine(); + } else if (c == '\n') { + nextStateLocation = nextStateLocation.AddLine(); + } else if (c =='<' && position + 2 < content.Length && content[position+1] == '#') { + TagEndLocation = nextStateLocation; + char type = content[position+2]; + if (type == '@') { + nextStateLocation = nextStateLocation.AddCols (2); + value = content.Substring (start, position - start); + position += 3; + return State.Directive; + } else if (type == '=') { + nextStateLocation = nextStateLocation.AddCols (2); + value = content.Substring (start, position - start); + position += 3; + return State.Expression; + } else if (type == '+') { + nextStateLocation = nextStateLocation.AddCols (2); + value = content.Substring (start, position - start); + position += 3; + return State.Helper; + } else { + value = content.Substring (start, position - start); + nextStateLocation = nextStateLocation.AddCol (); + position += 2; + return State.Block; + } + } + } + //EOF is only valid when we're in content + value = content.Substring (start); + return State.EOF; + } + + int IsNewLine() { + int found = 0; + + if (position < content.Length && content[position] == '\r') { + found++; + } + if (position+found < content.Length && content[position+found] == '\n') { + found++; + } + return found; + } + + State NextStateInDirective () { + for (; position < content.Length; position++) { + char c = content[position]; + if (c == '\r') { + if (position + 1 < content.Length && content[position + 1] == '\n') + position++; + nextStateLocation = nextStateLocation.AddLine(); + } else if (c == '\n') { + nextStateLocation = nextStateLocation.AddLine(); + } else if (Char.IsLetter (c)) { + return State.DirectiveName; + } else if (c == '=') { + nextStateLocation = nextStateLocation.AddCol (); + position++; + return State.DirectiveValue; + } else if (c == '#' && position + 1 < content.Length && content[position+1] == '>') { + position+=2; + TagEndLocation = nextStateLocation.AddCols (2); + nextStateLocation = nextStateLocation.AddCols (3); + + //skip newlines directly after directives + if ((position += IsNewLine()) > 0) { + nextStateLocation = nextStateLocation.AddLine(); + } + + return State.Content; + } else if (!Char.IsWhiteSpace (c)) { + throw new ParserException ("Directive ended unexpectedly with character '" + c + "'", nextStateLocation); + } else { + nextStateLocation = nextStateLocation.AddCol (); + } + } + throw new ParserException ("Unexpected end of file.", nextStateLocation); + } + + public State State { + get; private set; + } + + public int Position { + get { return position; } + } + + public string Content { + get { return content; } + } + + public string Value { + get { return value; } + } + + public Location Location { get; private set; } + public Location TagStartLocation { get; private set; } + public Location TagEndLocation { get; private set; } + } + + public enum State + { + Content = 0, + Directive, + Expression, + Block, + Helper, + DirectiveName, + DirectiveValue, + Name, + EOF + } + + public class ParserException : Exception + { + public ParserException (string message, Location location) : base (message) + { + Location = location; + } + + public Location Location { get; private set; } + } +} diff --git a/SparkleShare/Windows/tools/TextTemplating/README.md b/SparkleShare/Windows/tools/TextTemplating/README.md new file mode 100644 index 00000000..515765a0 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/README.md @@ -0,0 +1,19 @@ +TextTemplating +============== + +This is the TextTemplating tool inluded in MonoDevelop. +The original location of these files is +https://github.com/mono/monodevelop/tree/master/main/src/addins/TextTemplating + +Building on Windows +------------------- + +Run build.cmd or open TextTemplating.sln in visual studio 2010 +Dotnet framework 4 must be installed. + + +License +------- + +Licensed under the MIT/X11 license: http://www.opensource.org/licenses/mit-license.php + diff --git a/SparkleShare/Windows/tools/TextTemplating/TextTemplating.sln b/SparkleShare/Windows/tools/TextTemplating/TextTemplating.sln new file mode 100644 index 00000000..3de6beb6 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/TextTemplating.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.TextTemplating", "Mono.TextTemplating\Mono.TextTemplating.csproj", "{A2364D6A-00EF-417C-80A6-815726C70032}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TextTransform", "TextTransform\TextTransform.csproj", "{D1D35409-C814-47F6-B038-B9B5BF0FE490}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Release|Any CPU = Release|Any CPU + Debug|Any CPU = Debug|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A2364D6A-00EF-417C-80A6-815726C70032}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A2364D6A-00EF-417C-80A6-815726C70032}.Release|Any CPU.Build.0 = Release|Any CPU + {A2364D6A-00EF-417C-80A6-815726C70032}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A2364D6A-00EF-417C-80A6-815726C70032}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D1D35409-C814-47F6-B038-B9B5BF0FE490}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D1D35409-C814-47F6-B038-B9B5BF0FE490}.Release|Any CPU.Build.0 = Release|Any CPU + {D1D35409-C814-47F6-B038-B9B5BF0FE490}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D1D35409-C814-47F6-B038-B9B5BF0FE490}.Debug|Any CPU.Build.0 = Debug|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/SparkleShare/Windows/tools/TextTemplating/TextTransform/AssemblyInfo.cs b/SparkleShare/Windows/tools/TextTemplating/TextTransform/AssemblyInfo.cs new file mode 100644 index 00000000..abe1e8b4 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/TextTransform/AssemblyInfo.cs @@ -0,0 +1,39 @@ +// +// AssemblyInfo.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2009 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. +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. + +[assembly: AssemblyTitle("TextTransform")] +[assembly: AssemblyDescription("T4 text transformation tool")] +[assembly: AssemblyCompany("The Mono Project")] +[assembly: AssemblyProduct("MonoDevelop")] +[assembly: AssemblyCopyright("MIT/X11")] + +//[assembly: AssemblyVersion("1.0.0.0")] + diff --git a/SparkleShare/Windows/tools/TextTemplating/TextTransform/ChangeLog b/SparkleShare/Windows/tools/TextTemplating/TextTransform/ChangeLog new file mode 100644 index 00000000..08db48ec --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/TextTransform/ChangeLog @@ -0,0 +1,25 @@ +2009-08-12 Michael Hutchinson + + * Makefile.am: + * TextTransform.csproj: Include the ASP.NET MVC and + TextTemplating addins in the main solution and build. + +2009-03-13 Michael Hutchinson + + * TextTransform.csproj: Move output dir from ../bin to + ../build. + +2009-03-05 Michael Hutchinson + + * TextTransform.csproj: Updated. + + * TextTransform.cs: Complete the runner implementation. + +2009-03-04 Michael Hutchinson + + * Options.cs: + * AssemblyInfo.cs: + * TextTransform.cs: + * TextTransform.csproj: Stub out the command-line + TextTransform tool. + diff --git a/SparkleShare/Windows/tools/TextTemplating/TextTransform/Makefile.am b/SparkleShare/Windows/tools/TextTemplating/TextTransform/Makefile.am new file mode 100644 index 00000000..bd472254 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/TextTransform/Makefile.am @@ -0,0 +1,35 @@ +ADDIN_BUILD = $(top_builddir)/build/AddIns/MonoDevelop.TextTemplating +ASSEMBLY = $(ADDIN_BUILD)/TextTransform.exe + +DEPS = $(top_builddir)/build/AddIns/MonoDevelop.TextTemplating/Mono.TextTemplating.dll + +REFS = \ + -r:System \ + -r:System.Core + +FILES = \ + AssemblyInfo.cs \ + Options.cs \ + TextTransform.cs + +RES = + +all: $(ASSEMBLY) $(ASSEMBLY).mdb $(DATA_FILE_BUILD) + +$(ASSEMBLY): $(build_sources) $(build_resources) $(DEPS) + mkdir -p $(ADDIN_BUILD) + $(CSC) $(CSC_FLAGS) -debug -out:$@ -target:exe $(REFS) $(build_deps) \ + $(build_resources:%=/resource:%) $(build_sources) + +$(ASSEMBLY).mdb: $(ASSEMBLY) + +check: all + +assemblydir = $(MD_ADDIN_DIR)/MonoDevelop.TextTemplating +assembly_DATA = $(ASSEMBLY) $(ASSEMBLY).mdb + +CLEANFILES = $(ASSEMBLY) $(ASSEMBLY).mdb +EXTRA_DIST = $(FILES) $(RES) + +include $(top_srcdir)/Makefile.include + diff --git a/SparkleShare/Windows/tools/TextTemplating/TextTransform/Options.cs b/SparkleShare/Windows/tools/TextTemplating/TextTransform/Options.cs new file mode 100644 index 00000000..a64ea4d4 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/TextTransform/Options.cs @@ -0,0 +1,1112 @@ +// +// Options.cs +// +// Authors: +// Jonathan Pryor +// +// Copyright (C) 2008 Novell (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. +// + +// Compile With: +// gmcs -debug+ -r:System.Core Options.cs -o:NDesk.Options.dll +// gmcs -debug+ -d:LINQ -r:System.Core Options.cs -o:NDesk.Options.dll +// +// The LINQ version just changes the implementation of +// OptionSet.Parse(IEnumerable), and confers no semantic changes. + +// +// A Getopt::Long-inspired option parsing library for C#. +// +// NDesk.Options.OptionSet is built upon a key/value table, where the +// key is a option format string and the value is a delegate that is +// invoked when the format string is matched. +// +// Option format strings: +// Regex-like BNF Grammar: +// name: .+ +// type: [=:] +// sep: ( [^{}]+ | '{' .+ '}' )? +// aliases: ( name type sep ) ( '|' name type sep )* +// +// Each '|'-delimited name is an alias for the associated action. If the +// format string ends in a '=', it has a required value. If the format +// string ends in a ':', it has an optional value. If neither '=' or ':' +// is present, no value is supported. `=' or `:' need only be defined on one +// alias, but if they are provided on more than one they must be consistent. +// +// Each alias portion may also end with a "key/value separator", which is used +// to split option values if the option accepts > 1 value. If not specified, +// it defaults to '=' and ':'. If specified, it can be any character except +// '{' and '}' OR the *string* between '{' and '}'. If no separator should be +// used (i.e. the separate values should be distinct arguments), then "{}" +// should be used as the separator. +// +// Options are extracted either from the current option by looking for +// the option name followed by an '=' or ':', or is taken from the +// following option IFF: +// - The current option does not contain a '=' or a ':' +// - The current option requires a value (i.e. not a Option type of ':') +// +// The `name' used in the option format string does NOT include any leading +// option indicator, such as '-', '--', or '/'. All three of these are +// permitted/required on any named option. +// +// Option bundling is permitted so long as: +// - '-' is used to start the option group +// - all of the bundled options are a single character +// - at most one of the bundled options accepts a value, and the value +// provided starts from the next character to the end of the string. +// +// This allows specifying '-a -b -c' as '-abc', and specifying '-D name=value' +// as '-Dname=value'. +// +// Option processing is disabled by specifying "--". All options after "--" +// are returned by OptionSet.Parse() unchanged and unprocessed. +// +// Unprocessed options are returned from OptionSet.Parse(). +// +// Examples: +// int verbose = 0; +// OptionSet p = new OptionSet () +// .Add ("v", v => ++verbose) +// .Add ("name=|value=", v => Console.WriteLine (v)); +// p.Parse (new string[]{"-v", "--v", "/v", "-name=A", "/name", "B", "extra"}); +// +// The above would parse the argument string array, and would invoke the +// lambda expression three times, setting `verbose' to 3 when complete. +// It would also print out "A" and "B" to standard output. +// The returned array would contain the string "extra". +// +// C# 3.0 collection initializers are supported and encouraged: +// var p = new OptionSet () { +// { "h|?|help", v => ShowHelp () }, +// }; +// +// System.ComponentModel.TypeConverter is also supported, allowing the use of +// custom data types in the callback type; TypeConverter.ConvertFromString() +// is used to convert the value option to an instance of the specified +// type: +// +// var p = new OptionSet () { +// { "foo=", (Foo f) => Console.WriteLine (f.ToString ()) }, +// }; +// +// Random other tidbits: +// - Boolean options (those w/o '=' or ':' in the option format string) +// are explicitly enabled if they are followed with '+', and explicitly +// disabled if they are followed with '-': +// string a = null; +// var p = new OptionSet () { +// { "a", s => a = s }, +// }; +// p.Parse (new string[]{"-a"}); // sets v != null +// p.Parse (new string[]{"-a+"}); // sets v != null +// p.Parse (new string[]{"-a-"}); // sets v == null +// + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Globalization; +using System.IO; +using System.Runtime.Serialization; +using System.Security.Permissions; +using System.Text; +using System.Text.RegularExpressions; + +#if LINQ +using System.Linq; +#endif + +#if TEST +using NDesk.Options; +#endif + +#if NDESK_OPTIONS +namespace NDesk.Options +#else +namespace Mono.Options +#endif +{ + public class OptionValueCollection : IList, IList { + + List values = new List (); + OptionContext c; + + internal OptionValueCollection (OptionContext c) + { + this.c = c; + } + + #region ICollection + void ICollection.CopyTo (Array array, int index) {(values as ICollection).CopyTo (array, index);} + bool ICollection.IsSynchronized {get {return (values as ICollection).IsSynchronized;}} + object ICollection.SyncRoot {get {return (values as ICollection).SyncRoot;}} + #endregion + + #region ICollection + public void Add (string item) {values.Add (item);} + public void Clear () {values.Clear ();} + public bool Contains (string item) {return values.Contains (item);} + public void CopyTo (string[] array, int arrayIndex) {values.CopyTo (array, arrayIndex);} + public bool Remove (string item) {return values.Remove (item);} + public int Count {get {return values.Count;}} + public bool IsReadOnly {get {return false;}} + #endregion + + #region IEnumerable + IEnumerator IEnumerable.GetEnumerator () {return values.GetEnumerator ();} + #endregion + + #region IEnumerable + public IEnumerator GetEnumerator () {return values.GetEnumerator ();} + #endregion + + #region IList + int IList.Add (object value) {return (values as IList).Add (value);} + bool IList.Contains (object value) {return (values as IList).Contains (value);} + int IList.IndexOf (object value) {return (values as IList).IndexOf (value);} + void IList.Insert (int index, object value) {(values as IList).Insert (index, value);} + void IList.Remove (object value) {(values as IList).Remove (value);} + void IList.RemoveAt (int index) {(values as IList).RemoveAt (index);} + bool IList.IsFixedSize {get {return false;}} + object IList.this [int index] {get {return this [index];} set {(values as IList)[index] = value;}} + #endregion + + #region IList + public int IndexOf (string item) {return values.IndexOf (item);} + public void Insert (int index, string item) {values.Insert (index, item);} + public void RemoveAt (int index) {values.RemoveAt (index);} + + private void AssertValid (int index) + { + if (c.Option == null) + throw new InvalidOperationException ("OptionContext.Option is null."); + if (index >= c.Option.MaxValueCount) + throw new ArgumentOutOfRangeException ("index"); + if (c.Option.OptionValueType == OptionValueType.Required && + index >= values.Count) + throw new OptionException (string.Format ( + c.OptionSet.MessageLocalizer ("Missing required value for option '{0}'."), c.OptionName), + c.OptionName); + } + + public string this [int index] { + get { + AssertValid (index); + return index >= values.Count ? null : values [index]; + } + set { + values [index] = value; + } + } + #endregion + + public List ToList () + { + return new List (values); + } + + public string[] ToArray () + { + return values.ToArray (); + } + + public override string ToString () + { + return string.Join (", ", values.ToArray ()); + } + } + + public class OptionContext { + private Option option; + private string name; + private int index; + private OptionSet set; + private OptionValueCollection c; + + public OptionContext (OptionSet set) + { + this.set = set; + this.c = new OptionValueCollection (this); + } + + public Option Option { + get {return option;} + set {option = value;} + } + + public string OptionName { + get {return name;} + set {name = value;} + } + + public int OptionIndex { + get {return index;} + set {index = value;} + } + + public OptionSet OptionSet { + get {return set;} + } + + public OptionValueCollection OptionValues { + get {return c;} + } + } + + public enum OptionValueType { + None, + Optional, + Required, + } + + public abstract class Option { + string prototype, description; + string[] names; + OptionValueType type; + int count; + string[] separators; + + protected Option (string prototype, string description) + : this (prototype, description, 1) + { + } + + protected Option (string prototype, string description, int maxValueCount) + { + if (prototype == null) + throw new ArgumentNullException ("prototype"); + if (prototype.Length == 0) + throw new ArgumentException ("Cannot be the empty string.", "prototype"); + if (maxValueCount < 0) + throw new ArgumentOutOfRangeException ("maxValueCount"); + + this.prototype = prototype; + this.names = prototype.Split ('|'); + this.description = description; + this.count = maxValueCount; + this.type = ParsePrototype (); + + if (this.count == 0 && type != OptionValueType.None) + throw new ArgumentException ( + "Cannot provide maxValueCount of 0 for OptionValueType.Required or " + + "OptionValueType.Optional.", + "maxValueCount"); + if (this.type == OptionValueType.None && maxValueCount > 1) + throw new ArgumentException ( + string.Format ("Cannot provide maxValueCount of {0} for OptionValueType.None.", maxValueCount), + "maxValueCount"); + if (Array.IndexOf (names, "<>") >= 0 && + ((names.Length == 1 && this.type != OptionValueType.None) || + (names.Length > 1 && this.MaxValueCount > 1))) + throw new ArgumentException ( + "The default option handler '<>' cannot require values.", + "prototype"); + } + + public string Prototype {get {return prototype;}} + public string Description {get {return description;}} + public OptionValueType OptionValueType {get {return type;}} + public int MaxValueCount {get {return count;}} + + public string[] GetNames () + { + return (string[]) names.Clone (); + } + + public string[] GetValueSeparators () + { + if (separators == null) + return new string [0]; + return (string[]) separators.Clone (); + } + + protected static T Parse (string value, OptionContext c) + { + Type tt = typeof (T); + bool nullable = tt.IsValueType && tt.IsGenericType && + !tt.IsGenericTypeDefinition && + tt.GetGenericTypeDefinition () == typeof (Nullable<>); + Type targetType = nullable ? tt.GetGenericArguments () [0] : typeof (T); + TypeConverter conv = TypeDescriptor.GetConverter (targetType); + T t = default (T); + try { + if (value != null) + t = (T) conv.ConvertFromString (value); + } + catch (Exception e) { + throw new OptionException ( + string.Format ( + c.OptionSet.MessageLocalizer ("Could not convert string `{0}' to type {1} for option `{2}'."), + value, targetType.Name, c.OptionName), + c.OptionName, e); + } + return t; + } + + internal string[] Names {get {return names;}} + internal string[] ValueSeparators {get {return separators;}} + + static readonly char[] NameTerminator = new char[]{'=', ':'}; + + private OptionValueType ParsePrototype () + { + char type = '\0'; + List seps = new List (); + for (int i = 0; i < names.Length; ++i) { + string name = names [i]; + if (name.Length == 0) + throw new ArgumentException ("Empty option names are not supported.", "prototype"); + + int end = name.IndexOfAny (NameTerminator); + if (end == -1) + continue; + names [i] = name.Substring (0, end); + if (type == '\0' || type == name [end]) + type = name [end]; + else + throw new ArgumentException ( + string.Format ("Conflicting option types: '{0}' vs. '{1}'.", type, name [end]), + "prototype"); + AddSeparators (name, end, seps); + } + + if (type == '\0') + return OptionValueType.None; + + if (count <= 1 && seps.Count != 0) + throw new ArgumentException ( + string.Format ("Cannot provide key/value separators for Options taking {0} value(s).", count), + "prototype"); + if (count > 1) { + if (seps.Count == 0) + this.separators = new string[]{":", "="}; + else if (seps.Count == 1 && seps [0].Length == 0) + this.separators = null; + else + this.separators = seps.ToArray (); + } + + return type == '=' ? OptionValueType.Required : OptionValueType.Optional; + } + + private static void AddSeparators (string name, int end, ICollection seps) + { + int start = -1; + for (int i = end+1; i < name.Length; ++i) { + switch (name [i]) { + case '{': + if (start != -1) + throw new ArgumentException ( + string.Format ("Ill-formed name/value separator found in \"{0}\".", name), + "prototype"); + start = i+1; + break; + case '}': + if (start == -1) + throw new ArgumentException ( + string.Format ("Ill-formed name/value separator found in \"{0}\".", name), + "prototype"); + seps.Add (name.Substring (start, i-start)); + start = -1; + break; + default: + if (start == -1) + seps.Add (name [i].ToString ()); + break; + } + } + if (start != -1) + throw new ArgumentException ( + string.Format ("Ill-formed name/value separator found in \"{0}\".", name), + "prototype"); + } + + public void Invoke (OptionContext c) + { + OnParseComplete (c); + c.OptionName = null; + c.Option = null; + c.OptionValues.Clear (); + } + + protected abstract void OnParseComplete (OptionContext c); + + public override string ToString () + { + return Prototype; + } + } + + [Serializable] + public class OptionException : Exception { + private string option; + + public OptionException () + { + } + + public OptionException (string message, string optionName) + : base (message) + { + this.option = optionName; + } + + public OptionException (string message, string optionName, Exception innerException) + : base (message, innerException) + { + this.option = optionName; + } + + protected OptionException (SerializationInfo info, StreamingContext context) + : base (info, context) + { + this.option = info.GetString ("OptionName"); + } + + public string OptionName { + get {return this.option;} + } + + [SecurityPermission (SecurityAction.LinkDemand, SerializationFormatter = true)] + public override void GetObjectData (SerializationInfo info, StreamingContext context) + { + base.GetObjectData (info, context); + info.AddValue ("OptionName", option); + } + } + + public delegate void OptionAction (TKey key, TValue value); + + public class OptionSet : KeyedCollection + { + public OptionSet () + : this (delegate (string f) {return f;}) + { + } + + public OptionSet (Converter localizer) + { + this.localizer = localizer; + } + + Converter localizer; + + public Converter MessageLocalizer { + get {return localizer;} + } + + protected override string GetKeyForItem (Option item) + { + if (item == null) + throw new ArgumentNullException ("option"); + if (item.Names != null && item.Names.Length > 0) + return item.Names [0]; + // This should never happen, as it's invalid for Option to be + // constructed w/o any names. + throw new InvalidOperationException ("Option has no names!"); + } + + [Obsolete ("Use KeyedCollection.this[string]")] + protected Option GetOptionForName (string option) + { + if (option == null) + throw new ArgumentNullException ("option"); + try { + return base [option]; + } + catch (KeyNotFoundException) { + return null; + } + } + + protected override void InsertItem (int index, Option item) + { + base.InsertItem (index, item); + AddImpl (item); + } + + protected override void RemoveItem (int index) + { + base.RemoveItem (index); + Option p = Items [index]; + // KeyedCollection.RemoveItem() handles the 0th item + for (int i = 1; i < p.Names.Length; ++i) { + Dictionary.Remove (p.Names [i]); + } + } + + protected override void SetItem (int index, Option item) + { + base.SetItem (index, item); + RemoveItem (index); + AddImpl (item); + } + + private void AddImpl (Option option) + { + if (option == null) + throw new ArgumentNullException ("option"); + List added = new List (option.Names.Length); + try { + // KeyedCollection.InsertItem/SetItem handle the 0th name. + for (int i = 1; i < option.Names.Length; ++i) { + Dictionary.Add (option.Names [i], option); + added.Add (option.Names [i]); + } + } + catch (Exception) { + foreach (string name in added) + Dictionary.Remove (name); + throw; + } + } + + public new OptionSet Add (Option option) + { + base.Add (option); + return this; + } + + sealed class ActionOption : Option { + Action action; + + public ActionOption (string prototype, string description, int count, Action action) + : base (prototype, description, count) + { + if (action == null) + throw new ArgumentNullException ("action"); + this.action = action; + } + + protected override void OnParseComplete (OptionContext c) + { + action (c.OptionValues); + } + } + + public OptionSet Add (string prototype, Action action) + { + return Add (prototype, null, action); + } + + public OptionSet Add (string prototype, string description, Action action) + { + if (action == null) + throw new ArgumentNullException ("action"); + Option p = new ActionOption (prototype, description, 1, + delegate (OptionValueCollection v) { action (v [0]); }); + base.Add (p); + return this; + } + + public OptionSet Add (string prototype, OptionAction action) + { + return Add (prototype, null, action); + } + + public OptionSet Add (string prototype, string description, OptionAction action) + { + if (action == null) + throw new ArgumentNullException ("action"); + Option p = new ActionOption (prototype, description, 2, + delegate (OptionValueCollection v) {action (v [0], v [1]);}); + base.Add (p); + return this; + } + + sealed class ActionOption : Option { + Action action; + + public ActionOption (string prototype, string description, Action action) + : base (prototype, description, 1) + { + if (action == null) + throw new ArgumentNullException ("action"); + this.action = action; + } + + protected override void OnParseComplete (OptionContext c) + { + action (Parse (c.OptionValues [0], c)); + } + } + + sealed class ActionOption : Option { + OptionAction action; + + public ActionOption (string prototype, string description, OptionAction action) + : base (prototype, description, 2) + { + if (action == null) + throw new ArgumentNullException ("action"); + this.action = action; + } + + protected override void OnParseComplete (OptionContext c) + { + action ( + Parse (c.OptionValues [0], c), + Parse (c.OptionValues [1], c)); + } + } + + public OptionSet Add (string prototype, Action action) + { + return Add (prototype, null, action); + } + + public OptionSet Add (string prototype, string description, Action action) + { + return Add (new ActionOption (prototype, description, action)); + } + + public OptionSet Add (string prototype, OptionAction action) + { + return Add (prototype, null, action); + } + + public OptionSet Add (string prototype, string description, OptionAction action) + { + return Add (new ActionOption (prototype, description, action)); + } + + protected virtual OptionContext CreateOptionContext () + { + return new OptionContext (this); + } + +#if LINQ + public List Parse (IEnumerable arguments) + { + bool process = true; + OptionContext c = CreateOptionContext (); + c.OptionIndex = -1; + var def = GetOptionForName ("<>"); + var unprocessed = + from argument in arguments + where ++c.OptionIndex >= 0 && (process || def != null) + ? process + ? argument == "--" + ? (process = false) + : !Parse (argument, c) + ? def != null + ? Unprocessed (null, def, c, argument) + : true + : false + : def != null + ? Unprocessed (null, def, c, argument) + : true + : true + select argument; + List r = unprocessed.ToList (); + if (c.Option != null) + c.Option.Invoke (c); + return r; + } +#else + public List Parse (IEnumerable arguments) + { + OptionContext c = CreateOptionContext (); + c.OptionIndex = -1; + bool process = true; + List unprocessed = new List (); + Option def = Contains ("<>") ? this ["<>"] : null; + foreach (string argument in arguments) { + ++c.OptionIndex; + if (argument == "--") { + process = false; + continue; + } + if (!process) { + Unprocessed (unprocessed, def, c, argument); + continue; + } + if (!Parse (argument, c)) + Unprocessed (unprocessed, def, c, argument); + } + if (c.Option != null) + c.Option.Invoke (c); + return unprocessed; + } +#endif + + private static bool Unprocessed (ICollection extra, Option def, OptionContext c, string argument) + { + if (def == null) { + extra.Add (argument); + return false; + } + c.OptionValues.Add (argument); + c.Option = def; + c.Option.Invoke (c); + return false; + } + + private readonly Regex ValueOption = new Regex ( + @"^(?--|-|/)(?[^:=]+)((?[:=])(?.*))?$"); + + protected bool GetOptionParts (string argument, out string flag, out string name, out string sep, out string value) + { + if (argument == null) + throw new ArgumentNullException ("argument"); + + flag = name = sep = value = null; + Match m = ValueOption.Match (argument); + if (!m.Success) { + return false; + } + flag = m.Groups ["flag"].Value; + name = m.Groups ["name"].Value; + if (m.Groups ["sep"].Success && m.Groups ["value"].Success) { + sep = m.Groups ["sep"].Value; + value = m.Groups ["value"].Value; + } + return true; + } + + protected virtual bool Parse (string argument, OptionContext c) + { + if (c.Option != null) { + ParseValue (argument, c); + return true; + } + + string f, n, s, v; + if (!GetOptionParts (argument, out f, out n, out s, out v)) + return false; + + Option p; + if (Contains (n)) { + p = this [n]; + c.OptionName = f + n; + c.Option = p; + switch (p.OptionValueType) { + case OptionValueType.None: + c.OptionValues.Add (n); + c.Option.Invoke (c); + break; + case OptionValueType.Optional: + case OptionValueType.Required: + ParseValue (v, c); + break; + } + return true; + } + // no match; is it a bool option? + if (ParseBool (argument, n, c)) + return true; + // is it a bundled option? + if (ParseBundledValue (f, string.Concat (n + s + v), c)) + return true; + + return false; + } + + private void ParseValue (string option, OptionContext c) + { + if (option != null) + foreach (string o in c.Option.ValueSeparators != null + ? option.Split (c.Option.ValueSeparators, StringSplitOptions.None) + : new string[]{option}) { + c.OptionValues.Add (o); + } + if (c.OptionValues.Count == c.Option.MaxValueCount || + c.Option.OptionValueType == OptionValueType.Optional) + c.Option.Invoke (c); + else if (c.OptionValues.Count > c.Option.MaxValueCount) { + throw new OptionException (localizer (string.Format ( + "Error: Found {0} option values when expecting {1}.", + c.OptionValues.Count, c.Option.MaxValueCount)), + c.OptionName); + } + } + + private bool ParseBool (string option, string n, OptionContext c) + { + Option p; + string rn; + if (n.Length >= 1 && (n [n.Length-1] == '+' || n [n.Length-1] == '-') && + Contains ((rn = n.Substring (0, n.Length-1)))) { + p = this [rn]; + string v = n [n.Length-1] == '+' ? option : null; + c.OptionName = option; + c.Option = p; + c.OptionValues.Add (v); + p.Invoke (c); + return true; + } + return false; + } + + private bool ParseBundledValue (string f, string n, OptionContext c) + { + if (f != "-") + return false; + for (int i = 0; i < n.Length; ++i) { + Option p; + string opt = f + n [i].ToString (); + string rn = n [i].ToString (); + if (!Contains (rn)) { + if (i == 0) + return false; + throw new OptionException (string.Format (localizer ( + "Cannot bundle unregistered option '{0}'."), opt), opt); + } + p = this [rn]; + switch (p.OptionValueType) { + case OptionValueType.None: + Invoke (c, opt, n, p); + break; + case OptionValueType.Optional: + case OptionValueType.Required: { + string v = n.Substring (i+1); + c.Option = p; + c.OptionName = opt; + ParseValue (v.Length != 0 ? v : null, c); + return true; + } + default: + throw new InvalidOperationException ("Unknown OptionValueType: " + p.OptionValueType); + } + } + return true; + } + + private static void Invoke (OptionContext c, string name, string value, Option option) + { + c.OptionName = name; + c.Option = option; + c.OptionValues.Add (value); + option.Invoke (c); + } + + private const int OptionWidth = 29; + + public void WriteOptionDescriptions (TextWriter o) + { + foreach (Option p in this) { + int written = 0; + if (!WriteOptionPrototype (o, p, ref written)) + continue; + + if (written < OptionWidth) + o.Write (new string (' ', OptionWidth - written)); + else { + o.WriteLine (); + o.Write (new string (' ', OptionWidth)); + } + + List lines = GetLines (localizer (GetDescription (p.Description))); + o.WriteLine (lines [0]); + string prefix = new string (' ', OptionWidth+2); + for (int i = 1; i < lines.Count; ++i) { + o.Write (prefix); + o.WriteLine (lines [i]); + } + } + } + + bool WriteOptionPrototype (TextWriter o, Option p, ref int written) + { + string[] names = p.Names; + + int i = GetNextOptionIndex (names, 0); + if (i == names.Length) + return false; + + if (names [i].Length == 1) { + Write (o, ref written, " -"); + Write (o, ref written, names [0]); + } + else { + Write (o, ref written, " --"); + Write (o, ref written, names [0]); + } + + for ( i = GetNextOptionIndex (names, i+1); + i < names.Length; i = GetNextOptionIndex (names, i+1)) { + Write (o, ref written, ", "); + Write (o, ref written, names [i].Length == 1 ? "-" : "--"); + Write (o, ref written, names [i]); + } + + if (p.OptionValueType == OptionValueType.Optional || + p.OptionValueType == OptionValueType.Required) { + if (p.OptionValueType == OptionValueType.Optional) { + Write (o, ref written, localizer ("[")); + } + Write (o, ref written, localizer ("=" + GetArgumentName (0, p.MaxValueCount, p.Description))); + string sep = p.ValueSeparators != null && p.ValueSeparators.Length > 0 + ? p.ValueSeparators [0] + : " "; + for (int c = 1; c < p.MaxValueCount; ++c) { + Write (o, ref written, localizer (sep + GetArgumentName (c, p.MaxValueCount, p.Description))); + } + if (p.OptionValueType == OptionValueType.Optional) { + Write (o, ref written, localizer ("]")); + } + } + return true; + } + + static int GetNextOptionIndex (string[] names, int i) + { + while (i < names.Length && names [i] == "<>") { + ++i; + } + return i; + } + + static void Write (TextWriter o, ref int n, string s) + { + n += s.Length; + o.Write (s); + } + + private static string GetArgumentName (int index, int maxIndex, string description) + { + if (description == null) + return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1); + string[] nameStart; + if (maxIndex == 1) + nameStart = new string[]{"{0:", "{"}; + else + nameStart = new string[]{"{" + index + ":"}; + for (int i = 0; i < nameStart.Length; ++i) { + int start, j = 0; + do { + start = description.IndexOf (nameStart [i], j); + } while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false); + if (start == -1) + continue; + int end = description.IndexOf ("}", start); + if (end == -1) + continue; + return description.Substring (start + nameStart [i].Length, end - start - nameStart [i].Length); + } + return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1); + } + + private static string GetDescription (string description) + { + if (description == null) + return string.Empty; + StringBuilder sb = new StringBuilder (description.Length); + int start = -1; + for (int i = 0; i < description.Length; ++i) { + switch (description [i]) { + case '{': + if (i == start) { + sb.Append ('{'); + start = -1; + } + else if (start < 0) + start = i + 1; + break; + case '}': + if (start < 0) { + if ((i+1) == description.Length || description [i+1] != '}') + throw new InvalidOperationException ("Invalid option description: " + description); + ++i; + sb.Append ("}"); + } + else { + sb.Append (description.Substring (start, i - start)); + start = -1; + } + break; + case ':': + if (start < 0) + goto default; + start = i + 1; + break; + default: + if (start < 0) + sb.Append (description [i]); + break; + } + } + return sb.ToString (); + } + + private static List GetLines (string description) + { + List lines = new List (); + if (string.IsNullOrEmpty (description)) { + lines.Add (string.Empty); + return lines; + } + int length = 80 - OptionWidth - 2; + int start = 0, end; + do { + end = GetLineEnd (start, length, description); + bool cont = false; + if (end < description.Length) { + char c = description [end]; + if (c == '-' || (char.IsWhiteSpace (c) && c != '\n')) + ++end; + else if (c != '\n') { + cont = true; + --end; + } + } + lines.Add (description.Substring (start, end - start)); + if (cont) { + lines [lines.Count-1] += "-"; + } + start = end; + if (start < description.Length && description [start] == '\n') + ++start; + } while (end < description.Length); + return lines; + } + + private static int GetLineEnd (int start, int length, string description) + { + int end = System.Math.Min (start + length, description.Length); + int sep = -1; + for (int i = start; i < end; ++i) { + switch (description [i]) { + case ' ': + case '\t': + case '\v': + case '-': + case ',': + case '.': + case ';': + sep = i; + break; + case '\n': + return i; + } + } + if (sep == -1 || end == description.Length) + return end; + return sep; + } + } +} + diff --git a/SparkleShare/Windows/tools/TextTemplating/TextTransform/TextTransform.cs b/SparkleShare/Windows/tools/TextTemplating/TextTransform/TextTransform.cs new file mode 100644 index 00000000..1f66bff1 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/TextTransform/TextTransform.cs @@ -0,0 +1,174 @@ +// +// Main.cs +// +// Author: +// Michael Hutchinson +// +// Copyright (c) 2009 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. + +using System; +using System.IO; +using System.Collections.Generic; +using Mono.Options; + +namespace Mono.TextTemplating +{ + class TextTransform + { + static OptionSet optionSet; + const string name ="TextTransform.exe"; + + public static int Main (string[] args) + { + if (args.Length == 0) { + ShowHelp (true); + } + + var generator = new TemplateGenerator (); + string outputFile = null, inputFile = null; + var directives = new List (); + var parameters = new List (); + var session = new Microsoft.VisualStudio.TextTemplating.TextTemplatingSession (); + string preprocess = null; + + optionSet = new OptionSet () { + { "o=|out=", "The name of the output {file}", s => outputFile = s }, + { "r=", "Assemblies to reference", s => generator.Refs.Add (s) }, + { "u=", "Namespaces to import <{0:namespace}>", s => generator.Imports.Add (s) }, + { "I=", "Paths to search for included files", s => generator.IncludePaths.Add (s) }, + { "P=", "Paths to search for referenced assemblies", s => generator.ReferencePaths.Add (s) }, + { "dp=", "Directive processor (name!class!assembly)", s => directives.Add (s) }, + { "a=", "Parameters ([processorName]![directiveName]!name!value)", s => parameters.Add (s) }, + { "h|?|help", "Show help", s => ShowHelp (false) }, + // { "k=,", "Session {key},{value} pairs", (s, t) => session.Add (s, t) }, + { "c=", "Preprocess the template into {0:class}", (s) => preprocess = s }, + }; + + var remainingArgs = optionSet.Parse (args); + + if (string.IsNullOrEmpty (outputFile)) { + Console.Error.WriteLine ("No output file specified."); + return -1; + } + + if (remainingArgs.Count != 1) { + Console.Error.WriteLine ("No input file specified."); + return -1; + } + inputFile = remainingArgs [0]; + + if (!File.Exists (inputFile)) { + Console.Error.WriteLine ("Input file '{0}' does not exist."); + return -1; + } + + //FIXME: implement quoting and escaping for values + foreach (var par in parameters) { + var split = par.Split ('!'); + if (split.Length < 2) { + Console.Error.WriteLine ("Parameter does not have enough values: {0}", par); + return -1; + } + if (split.Length > 2) { + Console.Error.WriteLine ("Parameter has too many values: {0}", par); + return -1; + } + string name = split[split.Length-2]; + string val = split[split.Length-1]; + if (string.IsNullOrEmpty (name)) { + Console.Error.WriteLine ("Parameter has no name: {0}", par); + return -1; + } + generator.AddParameter (split.Length > 3? split[0] : null, split.Length > 2? split[split.Length-3] : null, name, val); + } + + foreach (var dir in directives) { + var split = dir.Split ('!'); + if (split.Length != 3) { + Console.Error.WriteLine ("Directive does not have correct number of values: {0}", dir); + return -1; + } + foreach (var s in split) { + if (string.IsNullOrEmpty (s)) { + Console.Error.WriteLine ("Directive has missing value: {0}", dir); + return -1; + } + } + generator.AddDirectiveProcessor (split[0], split[1], split[2]); + } + + if (preprocess == null) { + Console.Write ("Processing '{0}'... ", inputFile); + generator.ProcessTemplate (inputFile, outputFile); + if (generator.Errors.HasErrors) { + Console.WriteLine ("failed."); + } else { + Console.WriteLine ("completed successfully."); + } + } else { + string className = preprocess; + string classNamespace = null; + int s = preprocess.LastIndexOf ('.'); + if (s > 0) { + classNamespace = preprocess.Substring (0, s); + className = preprocess.Substring (s + 1); + } + + Console.Write ("Preprocessing '{0}' into class '{1}.{2}'... ", inputFile, classNamespace, className); + string language; + string[] references; + generator.PreprocessTemplate (inputFile, className, classNamespace, outputFile, System.Text.Encoding.UTF8, + out language, out references); + if (generator.Errors.HasErrors) { + Console.WriteLine ("failed."); + } else { + Console.WriteLine ("completed successfully:"); + Console.WriteLine (" Language: {0}", language); + if (references != null && references.Length > 0) { + Console.WriteLine (" References:"); + foreach (string r in references) + Console.WriteLine (" {0}", r); + } + } + } + + foreach (System.CodeDom.Compiler.CompilerError err in generator.Errors) + Console.Error.WriteLine ("{0}({1},{2}): {3} {4}", err.FileName, err.Line, err.Column, + err.IsWarning? "WARNING" : "ERROR", err.ErrorText); + + return generator.Errors.HasErrors? -1 : 0; + } + + static void ShowHelp (bool concise) + { + Console.WriteLine ("TextTransform command line T4 processor"); + Console.WriteLine ("Usage: {0} [options] input-file", name); + if (concise) { + Console.WriteLine ("Use --help to display options."); + } else { + Console.WriteLine ("Options:"); + optionSet.WriteOptionDescriptions (System.Console.Out); + } + Console.WriteLine (); + Environment.Exit (0); + } + } +} \ No newline at end of file diff --git a/SparkleShare/Windows/tools/TextTemplating/TextTransform/TextTransform.csproj b/SparkleShare/Windows/tools/TextTemplating/TextTransform/TextTransform.csproj new file mode 100644 index 00000000..5820f5ac --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/TextTransform/TextTransform.csproj @@ -0,0 +1,62 @@ + + + + Debug + AnyCPU + 9.0.21022 + 2.0 + {D1D35409-C814-47F6-B038-B9B5BF0FE490} + Exe + TextTransform + Mono.TextTemplating + + + true + full + false + ..\bin + DEBUG + prompt + 4 + -o:out.txt in.tt + + + none + false + ..\bin + prompt + 4 + + + + + + + + + + + + + {A2364D6A-00EF-417C-80A6-815726C70032} + Mono.TextTemplating + False + + + + + + + + + + + + + + + + + + + diff --git a/SparkleShare/Windows/tools/TextTemplating/build.cmd b/SparkleShare/Windows/tools/TextTemplating/build.cmd new file mode 100644 index 00000000..8e0ecf30 --- /dev/null +++ b/SparkleShare/Windows/tools/TextTemplating/build.cmd @@ -0,0 +1,5 @@ +@echo off +set WinDirNet=%WinDir%\Microsoft.NET\Framework +set msbuild="%WinDirNet%\v4.0.30319\msbuild.exe" + +%msbuild% /t:Rebuild /p:Configuration=Release /p:Platform="Any CPU" %~dp0\TextTemplating.sln diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Tests/Gettext.Cs.Tests.csproj b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Tests/Gettext.Cs.Tests.csproj new file mode 100644 index 00000000..1bc30c81 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Tests/Gettext.Cs.Tests.csproj @@ -0,0 +1,67 @@ + + + Debug + AnyCPU + 9.0.21022 + 2.0 + {C4B4300B-5B96-4F43-BD7D-517A29693B30} + Library + Properties + Gettext.Cs.Tests + Gettext.Cs.Tests + v3.5 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + 3.5 + + + + 3.5 + + + + 3.5 + + + + + + + + + {D8869765-AB47-4C03-B2C5-E5498A55CA79} + Gettext.Cs + + + + + \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Tests/PoParserTest.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Tests/PoParserTest.cs new file mode 100644 index 00000000..57c8e936 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Tests/PoParserTest.cs @@ -0,0 +1,64 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + +using Gettext.Cs; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.IO; +using System.Collections.Generic; +using System; +using System.Linq; + +namespace Gettext.Cs.Tests +{ + /// + ///This is a test class for PoParserTest and is intended + ///to contain all PoParserTest Unit Tests + /// + [TestClass()] + public class PoParserTest + { + /// + /// Tests slashes in parsed strings + /// + /// + [TestMethod()] + public void ParseIntoDictionaryStringWithSlashesTest() + { + string msgid = @"The type of parameter \""${0}\"" is not supported"; + string msgstr = @"Il tipo del parametro \""${0}\"" non è supportato"; + + string parsedMsgid = @"The type of parameter ""${0}"" is not supported"; + string parsedMsgstr = @"Il tipo del parametro ""${0}"" non è supportato"; + + PoParser target = new PoParser(); + TextReader reader = new StringReader(String.Format(@" + msgid ""{0}"" + msgstr ""{1}"" + ", msgid, msgstr)); + + var actual = target.ParseIntoDictionary(reader); + + Assert.AreEqual(1, actual.Count, "Parsed dictionary entries count do not match"); + Assert.AreEqual(parsedMsgid, actual.Keys.ToArray()[0], "Key does not match"); + Assert.AreEqual(parsedMsgstr, actual.Values.ToArray()[0], "Value does not match"); + } + } +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Tests/Properties/AssemblyInfo.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..ef49090d --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,57 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 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("Gettext.Cs.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Gettext.Cs.Tests")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("532f2d56-549a-474c-b46b-82fc90f1db64")] + +// 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: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Web/Controls/AspTranslate.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Web/Controls/AspTranslate.cs new file mode 100644 index 00000000..263e6e8d --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Web/Controls/AspTranslate.cs @@ -0,0 +1,48 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System.Web.UI; + + +namespace Gettext.Cs.Web +{ + [ParseChildren(false)] + public abstract class AspTranslate : Control + { + string content; + + protected override void AddParsedSubObject(object obj) + { + if (obj is LiteralControl) + { + content = Translate(((LiteralControl)obj).Text); + } + } + + protected override void Render(HtmlTextWriter writer) + { + writer.Write(content); + } + + protected abstract string Translate(string text); + } +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Web/Gettext.Cs.Web.csproj b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Web/Gettext.Cs.Web.csproj new file mode 100644 index 00000000..ac6930a9 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Web/Gettext.Cs.Web.csproj @@ -0,0 +1,60 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {38474466-DA21-4D19-A4D8-E2E7918480D6} + Library + Properties + Gettext.Cs.Web + Gettext.Cs.Web + v3.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + 3.5 + + + + 3.5 + + + 3.5 + + + + + + + + + + + \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Web/Properties/AssemblyInfo.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Web/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..510861c0 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs.Web/Properties/AssemblyInfo.cs @@ -0,0 +1,58 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 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("Gettext.Cs.Web")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Gettext.Cs.Web")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("efc9a6d8-33cd-4cc5-8984-90847fea390e")] + +// 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 Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Gettext.Cs.csproj b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Gettext.Cs.csproj new file mode 100644 index 00000000..b3822e2b --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Gettext.Cs.csproj @@ -0,0 +1,83 @@ + + + + Debug + AnyCPU + 9.0.21022 + 2.0 + {D8869765-AB47-4C03-B2C5-E5498A55CA79} + Library + Properties + Gettext.Cs + Gettext.Cs + v3.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + + + + + + + + + True + True + Strings.tt + + + + + TextTemplatingFileGenerator + Strings.cs + PreserveNewest + + + + + + + + \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Parser/ParserRequestor.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Parser/ParserRequestor.cs new file mode 100644 index 00000000..d2888cfa --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Parser/ParserRequestor.cs @@ -0,0 +1,55 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Gettext.Cs +{ + /// + /// Interface for retrieving data from the parser. + /// + public interface IGettextParserRequestor + { + /// + /// Handles a key value pair parsed from the po file. + /// + void Handle(string key, string value); + } + + /// + /// Collects data from the parser into a dictionary. + /// + public class DictionaryGettextParserRequestor : Dictionary, IGettextParserRequestor + { + #region IGettextParserRequestor Members + + public void Handle(string key, string value) + { + this[key] = value; + } + + #endregion + } +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Parser/PoParser.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Parser/PoParser.cs new file mode 100644 index 00000000..b80d0bc9 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Parser/PoParser.cs @@ -0,0 +1,149 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; + +namespace Gettext.Cs +{ + /// + /// Parses standard po files. + /// + public class PoParser + { + /// + /// Parses an input po file. + /// + public void Parse(TextReader reader, IGettextParserRequestor requestor) + { + const int StateWaitingKey = 1; + const int StateConsumingKey = 2; + const int StateConsumingValue = 3; + + int state = StateWaitingKey; + + StringBuilder currentKey = null; + StringBuilder currentValue = null; + + string line; + while(true) { + line = reader.ReadLine(); + line = line == null ? null : line.Trim(); + if (line == null || line.Length == 0) + { + if (state == StateConsumingValue && + currentKey != null && + currentValue != null) + { + requestor.Handle(currentKey.ToString().Replace("\\n", "\n").Replace("\\\"", "\""), + currentValue.ToString().Replace("\\n", "\n").Replace("\\\"", "\"")); + currentKey = null; + currentValue = null; + } + + if (line == null) + break; + + state = StateWaitingKey; + continue; + } + else if (line[0] == '#') + { + continue; + } + + bool isMsgId = line.StartsWith("msgid "); + bool isMsgStr = !isMsgId && line.StartsWith("msgstr "); + + if (isMsgId || isMsgStr) + { + state = isMsgId ? StateConsumingKey : StateConsumingValue; + + int firstQuote = line.IndexOf('"'); + if (firstQuote == -1) + continue; + + int secondQuote = line.IndexOf('"', firstQuote + 1); + while (secondQuote != -1 && line[secondQuote - 1] == '\\') + secondQuote = line.IndexOf('"', secondQuote + 1); + if (secondQuote == -1) + continue; + + string piece = line.Substring(firstQuote + 1, secondQuote - firstQuote - 1); + + if (isMsgId) + { + currentKey = new StringBuilder(); + currentKey.Append(piece); + } + else + { + currentValue = new StringBuilder(); + currentValue.Append(piece); + } + } + else if (line[0] == '"') + { + if (line[line.Length - 1] == '"') + { + line = line.Substring(1, line.Length - 2); + } + else + { + line = line.Substring(1, line.Length - 1); + } + + switch (state) + { + case StateConsumingKey: + currentKey.Append(line); + break; + case StateConsumingValue: + currentValue.Append(line); + break; + } + } + } + } + + /// + /// Parses an input po file. + /// + public void Parse(string text, IGettextParserRequestor requestor) + { + Parse(new StringReader(text), requestor); + } + + /// + /// Parses an input po file into a dictionary. + /// + public Dictionary ParseIntoDictionary(TextReader reader) + { + var requestor = new DictionaryGettextParserRequestor(); + Parse(reader, requestor); + return requestor; + } + } +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Properties/AssemblyInfo.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..51d908d2 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Properties/AssemblyInfo.cs @@ -0,0 +1,58 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 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("Gettext.Cs")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Gettext.Cs")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("1c3b8e32-0c8d-4d0f-ae9b-d38e4b45690a")] + +// 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 Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/DatabaseResourceManager.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/DatabaseResourceManager.cs new file mode 100644 index 00000000..12b224c7 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/DatabaseResourceManager.cs @@ -0,0 +1,86 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Collections; +using System.Globalization; +using System.Resources; +using System.Configuration; + +namespace Gettext.Cs +{ + public class DatabaseResourceManager : System.Resources.ResourceManager + { + private string dsn; + private string sp; + + public DatabaseResourceManager() + : base() + { + this.dsn = ConfigurationManager.AppSettings["Gettext.ConnectionString"] ?? ConfigurationManager.ConnectionStrings["Gettext"].ConnectionString; + ResourceSets = new System.Collections.Hashtable(); + } + + public DatabaseResourceManager(string storedProcedure) + : this() + { + this.sp = storedProcedure; + } + + // Hack: kept for compatibility + public DatabaseResourceManager(string name, string path, string fileformat) + : this() + { + } + + protected override ResourceSet InternalGetResourceSet(CultureInfo culture, bool createIfNotExists, bool tryParents) + { + DatabaseResourceSet rs = null; + + if (ResourceSets.Contains(culture.Name)) + { + rs = ResourceSets[culture.Name] as DatabaseResourceSet; + } + else + { + lock (ResourceSets) + { + // Check hash table once again after lock is set + if (ResourceSets.Contains(culture.Name)) + { + rs = ResourceSets[culture.Name] as DatabaseResourceSet; + } + else + { + rs = new DatabaseResourceSet(dsn, culture, sp); + ResourceSets.Add(culture.Name, rs); + } + } + } + + return rs; + } + } +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/DatabaseResourceReader.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/DatabaseResourceReader.cs new file mode 100644 index 00000000..eab8fcc7 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/DatabaseResourceReader.cs @@ -0,0 +1,121 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Resources; +using System.Collections; +using System.Data.SqlClient; +using System.Globalization; +using System.Configuration; + +namespace Gettext.Cs +{ + public class DatabaseResourceReader : IResourceReader + { + private string dsn; + private string language; + private string sp; + + public DatabaseResourceReader(string dsn, CultureInfo culture) + { + this.dsn = dsn; + this.language = culture.Name; + } + + public DatabaseResourceReader(string dsn, CultureInfo culture, string sp) + { + this.sp = sp; + this.dsn = dsn; + this.language = culture.Name; + } + + public System.Collections.IDictionaryEnumerator GetEnumerator() + { + Hashtable dict = new Hashtable(); + + SqlConnection connection = new SqlConnection(dsn); + SqlCommand command = connection.CreateCommand(); + + if (language == "") + language = CultureInfo.InvariantCulture.Name; + + // Use stored procedure or plain text + if (sp == null) + { + command.CommandText = string.Format("SELECT MessageKey, MessageValue FROM Message WHERE Culture = '{0}'", language); + } + else + { + command.CommandText = sp; + command.CommandType = System.Data.CommandType.StoredProcedure; + command.Parameters.AddWithValue("@culture", language); + } + + try + { + connection.Open(); + + using (SqlDataReader reader = command.ExecuteReader()) + { + while (reader.Read()) + { + if (reader.GetValue(1) != System.DBNull.Value) + { + dict[reader.GetString(0)] = reader.GetString(1); + } + } + } + + } + catch + { + bool raise = false; + if (bool.TryParse(ConfigurationManager.AppSettings["Gettext.Throw"], out raise) && raise) + { + throw; + } + } + finally + { + connection.Close(); + } + + return dict.GetEnumerator(); + } + + public void Close() + { + } + + IEnumerator IEnumerable.GetEnumerator() + { + return this.GetEnumerator(); + } + + void IDisposable.Dispose() + { + } + } +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/DatabaseResourceSet.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/DatabaseResourceSet.cs new file mode 100644 index 00000000..c55b50a2 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/DatabaseResourceSet.cs @@ -0,0 +1,50 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Resources; +using System.Globalization; + +namespace Gettext.Cs +{ + public class DatabaseResourceSet : ResourceSet + { + internal DatabaseResourceSet(string dsn, CultureInfo culture) + : base (new DatabaseResourceReader(dsn, culture)) + { + } + + internal DatabaseResourceSet(string dsn, CultureInfo culture, string sp) + : base(new DatabaseResourceReader(dsn, culture, sp)) + { + } + + public override Type GetDefaultReader() + { + return typeof(DatabaseResourceReader); + } + } + +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/FileBasedResourceManager.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/FileBasedResourceManager.cs new file mode 100644 index 00000000..ec6c38b9 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/FileBasedResourceManager.cs @@ -0,0 +1,295 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Globalization; +using System.Reflection; +using System.IO; +using System.Collections; + +namespace Gettext.Cs +{ + /// + /// Extendable file based resource manager. + /// + public class FileBasedResourceManager : System.Resources.ResourceManager + { + #region Properties + + string path; + string fileformat; + + /// + /// Path to retrieve the files from. + /// + public string Path + { + get { return path; } + set { path = value; } + } + + /// + /// Format of the resource set po file based on {{culture}} and {{resource}} placeholders. + /// + public string FileFormat + { + get { return fileformat; } + set { fileformat = value; } + } + + #endregion + + #region Notification Events + + /// + /// Arguments for events related to the creation, successful or not, of a resource set. + /// + public class ResourceSetCreationEventArgs : EventArgs + { + /// + /// Exception in case of error, null on success. + /// + public Exception Exception { get; set; } + + /// + /// FileName from where the resource set was loaded. + /// + public String FileName { get; set; } + + /// + /// Type of the resource set being initialized. + /// + public Type ResourceSetType { get; set; } + + /// + /// Instance of the resource set created, may be null on error. + /// + public System.Resources.ResourceSet ResourceSet { get; set; } + + /// + /// Whether the creation was successful. + /// + public bool Success { get; set; } + } + + /// + /// Event that notifies the successful creation of a resource set. + /// + public event EventHandler CreatedResourceSet; + + /// + /// Event that notifies an error creating a resource set. + /// + public event EventHandler FailedResourceSet; + + protected void RaiseCreatedResourceSet(string filename, System.Resources.ResourceSet set) + { + var handler = CreatedResourceSet; + if (handler != null) + { + handler(this, new ResourceSetCreationEventArgs + { + FileName = filename, + ResourceSet = set, + ResourceSetType = this.ResourceSetType, + Success = true + }); + } + } + + protected void RaiseFailedResourceSet(string filename, Exception ex) + { + var handler = FailedResourceSet; + if (handler != null) + { + handler(this, new ResourceSetCreationEventArgs + { + FileName = filename, + ResourceSet = null, + ResourceSetType = this.ResourceSetType, + Success = false, + Exception = ex + }); + } + } + + #endregion + + /// + /// Creates a new instance. + /// + /// Name of the resource + /// Path to retrieve the files from + /// Format of the file name using {{resource}} and {{culture}} placeholders. + public FileBasedResourceManager(string name, string path, string fileformat) + : base() + { + this.path = path; + this.fileformat = fileformat; + this.BaseNameField = name; + + base.IgnoreCase = false; + base.ResourceSets = new System.Collections.Hashtable(); + } + + protected override string GetResourceFileName(System.Globalization.CultureInfo culture) + { + return fileformat.Replace("{{culture}}", culture.Name).Replace("{{resource}}", BaseNameField); + } + + protected override System.Resources.ResourceSet InternalGetResourceSet(System.Globalization.CultureInfo culture, bool createIfNotExists, bool tryParents) + { + if (path == null && fileformat == null) return null; + if (culture == null || culture.Equals(CultureInfo.InvariantCulture)) return null; + + System.Resources.ResourceSet rs = null; + Hashtable resourceSets = this.ResourceSets; + + if (!TryFetchResourceSet(resourceSets, culture, out rs)) + { + string resourceFileName = this.FindResourceFile(culture); + if (resourceFileName == null) + { + if (tryParents) + { + CultureInfo parent = culture.Parent; + rs = this.InternalGetResourceSet(parent, createIfNotExists, tryParents); + AddResourceSet(resourceSets, culture, ref rs); + return rs; + } + } + else + { + rs = this.CreateResourceSet(resourceFileName); + AddResourceSet(resourceSets, culture, ref rs); + return rs; + } + } + + return rs; + } + + protected virtual System.Resources.ResourceSet InternalCreateResourceSet(string resourceFileName) + { + object[] args = new object[] { resourceFileName }; + return (System.Resources.ResourceSet)Activator.CreateInstance(this.ResourceSetType, args); + } + + private System.Resources.ResourceSet CreateResourceSet(string resourceFileName) + { + System.Resources.ResourceSet set = null; + + try + { + set = InternalCreateResourceSet(resourceFileName); + RaiseCreatedResourceSet(resourceFileName, set); + } + catch (Exception ex) + { + RaiseFailedResourceSet(resourceFileName, ex); + } + + return set; + } + + private string FindResourceFile(CultureInfo culture) + { + string resourceFileName = this.GetResourceFileName(culture); + string path = this.path ?? String.Empty; + + // Try with simple path + filename combination + string fullpath = System.IO.Path.Combine(path, resourceFileName); + if (File.Exists(fullpath)) return fullpath; + + // If path is relative, attempt different directories + if (path == String.Empty || !System.IO.Path.IsPathRooted(path)) + { + // Try the entry assembly dir + if (Assembly.GetEntryAssembly() != null) + { + string dir = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), path); + fullpath = System.IO.Path.Combine(dir, resourceFileName); + if (File.Exists(fullpath)) return fullpath; + } + + // Else try the executing assembly dir + if (Assembly.GetExecutingAssembly() != null) + { + if (Assembly.GetEntryAssembly() == null || System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) != System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)) + { + string dir = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), path); + fullpath = System.IO.Path.Combine(dir, resourceFileName); + if (File.Exists(fullpath)) return fullpath; + } + } + } + + return null; + } + + private void AddResourceSet(Hashtable localResourceSets, CultureInfo culture, ref System.Resources.ResourceSet rs) + { + lock (localResourceSets) + { + if (localResourceSets.Contains(culture)) + { + var existing = (System.Resources.ResourceSet)localResourceSets[culture]; + + if (existing != null && !object.Equals(existing, rs)) + { + rs.Dispose(); + rs = existing; + var a = (System.Collections.Specialized.NameValueCollection)System.Configuration.ConfigurationManager.GetSection("appSettings"); + } + } + else + { + localResourceSets.Add(culture, rs); + } + } + } + + private bool TryFetchResourceSet(Hashtable localResourceSets, CultureInfo culture, out System.Resources.ResourceSet set) + { + lock (localResourceSets) + { + if (ResourceSets.Contains(culture)) + { + set = (System.Resources.ResourceSet)ResourceSets[culture]; + return true; + } + + set = null; + return false; + } + } + + private bool ValidateGetResourceSet(CultureInfo culture) + { + return !(culture == null || culture.Equals(CultureInfo.InvariantCulture) || String.IsNullOrEmpty(culture.Name)); + } + + } +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/GettextResourceManager.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/GettextResourceManager.cs new file mode 100644 index 00000000..3d62b376 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/GettextResourceManager.cs @@ -0,0 +1,150 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; +using System.Reflection; +using System.Diagnostics; +using System.Globalization; +using System.Configuration; +using System.Collections.Specialized; +using System.Security.Permissions; +using System.Collections; + +namespace Gettext.Cs +{ + /// + /// Gettext based resource manager that reads from po files. + /// + public class GettextResourceManager : FileBasedResourceManager + { + #region Defaults + + const string defaultFileFormat = "{{culture}}\\{{resource}}.po"; + const string defaultPath = ""; + + #endregion + + #region Properties + + /// + /// Returns the Gettext resource set type used. + /// + public override Type ResourceSetType + { + get { return typeof(GettextResourceSet); } + } + + #endregion + + #region Constructos + + /// + /// Creates a new instance. + /// + /// Name of the resource + /// Path to retrieve the files from + /// Format of the file name using {{resource}} and {{culture}} placeholders. + public GettextResourceManager(string name, string path, string fileformat) + : base(name, path, fileformat) + { + } + + /// + /// Creates a new instance using local path and "{{culture}}\{{resource}}.po" file format. + /// + /// Name of the resource + public GettextResourceManager(string name) + : base(name, defaultPath, defaultFileFormat) + { + } + + #endregion + + #region Configuration + + /// + /// Loads the named configuration section and retrieves file format and path from "fileformat" and "path" settings. + /// + /// Name of the section to retrieve. + /// True if the configuration section was loaded. + public bool LoadConfiguration(string section) + { + var config = ConfigurationManager.GetSection(section) as NameValueCollection; + + if (config == null) return false; + + this.FileFormat = config["fileformat"] ?? FileFormat; + this.Path = config["path"] ?? Path; + + return true; + } + + /// + /// Creates a new instance retrieving path and fileformat from the specified configuration section. + /// + /// Name of the resource + /// Name of the configuration section + /// New instance of ResourceManager + public static FileBasedResourceManager CreateFromConfiguration(string name, string section) + { + return CreateFromConfiguration(name, section, defaultFileFormat, defaultPath); + } + + /// + /// Creates a new instance retrieving path and fileformat from the specified configuration section. + /// + /// Name of the resource + /// Name of the configuration section with fileformat and path settings + /// File format to be used if configuration could not be retrieved + /// Path to be used if configuration could not be retrieved + /// New instance of ResourceManager + public static FileBasedResourceManager CreateFromConfiguration(string name, string section, string fallbackFileFormat, string fallbackPath) + { + var config = ConfigurationManager.GetSection(section) as NameValueCollection; + + string fileformat = null; + string path = null; + + if (config == null) + { + fileformat = fallbackFileFormat; + path = fallbackPath; + } + else + { + fileformat = config["fileformat"] ?? fallbackFileFormat; + path = config["path"] ?? fallbackPath; + } + + return new FileBasedResourceManager(name, path, fileformat); + } + + #endregion + + } + + +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/GettextResourceReader.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/GettextResourceReader.cs new file mode 100644 index 00000000..dc3a0b7e --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/GettextResourceReader.cs @@ -0,0 +1,87 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Resources; +using System.IO; + +namespace Gettext.Cs +{ + public class GettextResourceReader : IResourceReader + { + Stream stream; + + public GettextResourceReader(Stream stream) + { + this.stream = stream; + } + + #region IResourceReader Members + + public void Close() + { + if (stream != null) + { + this.stream.Close(); + } + } + + public System.Collections.IDictionaryEnumerator GetEnumerator() + { + if (stream == null) + { + throw new ArgumentNullException("Input stream cannot be null"); + } + + using (var reader = new StreamReader(stream)) + { + return new PoParser().ParseIntoDictionary(reader).GetEnumerator(); + } + } + + #endregion + + #region IEnumerable Members + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return this.GetEnumerator(); + } + + #endregion + + #region IDisposable Members + + public void Dispose() + { + if (stream != null) + { + stream.Dispose(); + } + } + + #endregion + } +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/GettextResourceSet.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/GettextResourceSet.cs new file mode 100644 index 00000000..614eb9c8 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Resource/GettextResourceSet.cs @@ -0,0 +1,49 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; +using System.Globalization; + +namespace Gettext.Cs +{ + public class GettextResourceSet : System.Resources.ResourceSet + { + public GettextResourceSet(string filename) + : base(new GettextResourceReader(File.OpenRead(filename))) + { + } + + public GettextResourceSet(Stream stream) + : base(new GettextResourceReader(stream)) + { + } + + public override Type GetDefaultReader() + { + return typeof(Gettext.Cs.GettextResourceReader); + } + } +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Templates/Strings.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Templates/Strings.cs new file mode 100644 index 00000000..64c9ec22 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Templates/Strings.cs @@ -0,0 +1,166 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +// +// This code was generated by a tool. Any changes made manually will be lost +// the next time this code is regenerated. +// + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Globalization; +using System.Threading; +using System.Configuration; +using System.Diagnostics; +using System.IO; +using System.Reflection; + +namespace Gettext +{ + public class Strings + { + private static Object resourceManLock = new Object(); + private static System.Resources.ResourceManager resourceMan; + private static System.Globalization.CultureInfo resourceCulture; + + public const string ResourceName = "Strings"; + + private static string resourcesDir = GetSetting("ResourcesDir", "Po"); + private static string fileFormat = GetSetting("ResourcesFileFormat", "{{culture}}/{{resource}}.po"); + + private static string GetSetting(string setting, string defaultValue) + { + var section = (System.Collections.Specialized.NameValueCollection)System.Configuration.ConfigurationManager.GetSection("appSettings"); + if (section == null) return defaultValue; + else return section[setting] ?? defaultValue; + } + + + /// + /// Resources directory used to retrieve files from. + /// + public static string ResourcesDirectory + { + get { return resourcesDir; } + set { resourcesDir = value; } + } + + /// + /// Format of the file based on culture and resource name. + /// + public static string FileFormat + { + get { return fileFormat; } + set { fileFormat = value; } + } + + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + public static System.Resources.ResourceManager ResourceManager + { + get + { + + if (object.ReferenceEquals(resourceMan, null)) + { + lock (resourceManLock) + { + if (object.ReferenceEquals(resourceMan, null)) + { + var directory = resourcesDir; + var mgr = new global::Gettext.Cs.GettextResourceManager(ResourceName, directory, fileFormat); + resourceMan = mgr; + } + } + } + + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + public static System.Globalization.CultureInfo Culture + { + get { return resourceCulture; } + set { resourceCulture = value; } + } + + /// + /// Looks up a localized string; used to mark string for translation as well. + /// + public static string T(string t) + { + return T(null, t); + } + + /// + /// Looks up a localized string; used to mark string for translation as well. + /// + public static string T(CultureInfo info, string t) + { + if (String.IsNullOrEmpty(t)) return t; + var translated = ResourceManager.GetString(t, info ?? resourceCulture); + return String.IsNullOrEmpty(translated) ? t : translated; + } + + /// + /// Looks up a localized string and formats it with the parameters provided; used to mark string for translation as well. + /// + public static string T(string t, params object[] parameters) + { + return T(null, t, parameters); + } + + /// + /// Looks up a localized string and formats it with the parameters provided; used to mark string for translation as well. + /// + public static string T(CultureInfo info, string t, params object[] parameters) + { + if (String.IsNullOrEmpty(t)) return t; + return String.Format(T(info, t), parameters); + } + + /// + /// Marks a string for future translation, does not translate it now. + /// + public static string M(string t) + { + return t; + } + + /// + /// Returns the resource set available for the specified culture. + /// + public static System.Resources.ResourceSet GetResourceSet(CultureInfo culture) + { + return ResourceManager.GetResourceSet(culture, true, true); + } + } +} + diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Templates/Strings.tt b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Templates/Strings.tt new file mode 100644 index 00000000..88ff36c8 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Core/Gettext.Cs/Templates/Strings.tt @@ -0,0 +1,196 @@ +<#@ template language="C#v3.5" hostspecific="True" #> +// +// This code was generated by a tool. Any changes made manually will be lost +// the next time this code is regenerated. +// + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Globalization; +using System.Threading; +using System.Configuration; +using System.Diagnostics; +using System.IO; +using System.Reflection; + +namespace <#= this.NamespaceName #> +{ + public class <#= this.ClassName #> + { + private static Object resourceManLock = new Object(); + private static System.Resources.ResourceManager resourceMan; + private static System.Globalization.CultureInfo resourceCulture; + + public const string ResourceName = "<#= this.ResourceName #>"; + +<# if (!UseDatabase) { #> + private static string resourcesDir = GetSetting("ResourcesDir", "<#= this.DefaultResourceDir #>"); + private static string fileFormat = GetSetting("ResourcesFileFormat", "<#= this.DefaultFileFormat #>"); +<# } #> + + private static string GetSetting(string setting, string defaultValue) + { + var section = (System.Collections.Specialized.NameValueCollection)System.Configuration.ConfigurationManager.GetSection("<#= this.ConfigurationSection #>"); + if (section == null) return defaultValue; + else return section[setting] ?? defaultValue; + } + +<# if (!UseDatabase) { #> + /// + /// Resources directory used to retrieve files from. + /// + public static string ResourcesDirectory + { + get { return resourcesDir; } + set { resourcesDir = value; } + } + + /// + /// Format of the file based on culture and resource name. + /// + public static string FileFormat + { + get { return fileFormat; } + set { fileFormat = value; } + } +<# } #> + +<# if (ResourceManagerExpires) { #> + private static DateTime resourceManagerLoadedAt = DateTime.Now; +<# } #> + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + public static System.Resources.ResourceManager ResourceManager + { + get + { +<# if (ResourceManagerExpires) { #> + if (resourceMan != null && DateTime.Now.Subtract(resourceManagerLoadedAt).TotalMinutes >= <#= ResourceManagerTTL #>) + { + lock (resourceManLock) + { + if (resourceMan != null && DateTime.Now.Subtract(resourceManagerLoadedAt).TotalMinutes >= <#= ResourceManagerTTL #>) + { + resourceMan.ReleaseAllResources(); + resourceMan = null; + } + } + } +<# } #> + + if (object.ReferenceEquals(resourceMan, null)) + { + lock (resourceManLock) + { + if (object.ReferenceEquals(resourceMan, null)) + { +<# if (UseDatabase) { #> + var mgr = new global::Gettext.Cs.DatabaseResourceManager("<#= this.StoredProcedureName #>"); +<# } else { #> + var directory = resourcesDir; + <# if (ServerMapPath) { #> + if (System.Web.HttpContext.Current != null) + directory = System.Web.HttpContext.Current.Server.MapPath(directory); + <# } #> + var mgr = <#= String.Format(this.ResourceManagerCtor, this.ResourceManagerType) #>; + <# if (ResourceManagerExpires) { #> + resourceManagerLoadedAt = DateTime.Now; + <# } #> +<# } #> + resourceMan = mgr; + } + } + } + + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + public static System.Globalization.CultureInfo Culture + { + get { return resourceCulture; } + set { resourceCulture = value; } + } + + /// + /// Looks up a localized string; used to mark string for translation as well. + /// + public static string T(string t) + { + return T(null, t); + } + + /// + /// Looks up a localized string; used to mark string for translation as well. + /// + public static string T(CultureInfo info, string t) + { + if (String.IsNullOrEmpty(t)) return t; + var translated = ResourceManager.GetString(t, info ?? resourceCulture); + return String.IsNullOrEmpty(translated) ? t : translated; + } + + /// + /// Looks up a localized string and formats it with the parameters provided; used to mark string for translation as well. + /// + public static string T(string t, params object[] parameters) + { + return T(null, t, parameters); + } + + /// + /// Looks up a localized string and formats it with the parameters provided; used to mark string for translation as well. + /// + public static string T(CultureInfo info, string t, params object[] parameters) + { + if (String.IsNullOrEmpty(t)) return t; + return String.Format(T(info, t), parameters); + } + + /// + /// Marks a string for future translation, does not translate it now. + /// + public static string M(string t) + { + return t; + } + + /// + /// Returns the resource set available for the specified culture. + /// + public static System.Resources.ResourceSet GetResourceSet(CultureInfo culture) + { + return ResourceManager.GetResourceSet(culture, true, true); + } + } +} + +<#+ + // Template parameters + + string ClassName = "Strings"; + string ResourceName = "Strings"; + string NamespaceName = "Gettext"; + + string ResourceManagerType = "global::Gettext.Cs.GettextResourceManager"; + string ResourceManagerCtor = "new {0}(ResourceName, directory, fileFormat)"; + string DefaultResourceDir = "Po"; + string DefaultFileFormat = "{{culture}}/{{resource}}.po"; + + string ConfigurationSection = "appSettings"; + bool ServerMapPath = false; + + bool ResourceManagerExpires = false; + int ResourceManagerTTL = 0; + + bool UseDatabase = false; + string StoredProcedureName = "GettextGetResourceSet"; +#> diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Gettext.CsUtils.sln b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Gettext.CsUtils.sln new file mode 100644 index 00000000..b1d2c6bd --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Gettext.CsUtils.sln @@ -0,0 +1,125 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{FD8EF9F6-9B97-456A-98E0-E94DB2BD3EED}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Lib", "Lib", "{64737816-54EF-4891-A58D-0642F07F09AD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gnu.Getopt", "Lib\Gnu.Getopt\Gnu.Getopt.csproj", "{379BC478-7D84-4E0E-A4B8-197905C824AE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.AspExtract", "Tools\Gettext.AspExtract\Gettext.AspExtract.csproj", "{88A09FE2-5DE0-4C6E-9C4C-BB5E8A490CF5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.Msgfmt", "Tools\Gettext.Msgfmt\Gettext.Msgfmt.csproj", "{F72A7CBA-E656-4ECA-97F9-2B601E0BCDF9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.ResourcesReplacer", "Tools\Gettext.ResourcesReplacer\Gettext.ResourcesReplacer.csproj", "{11BDD346-EDFA-439D-A42D-A1D4FDB64C9A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{380A3584-88CB-4153-9BC1-C18CFAE9EF26}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.Cs", "Core\Gettext.Cs\Gettext.Cs.csproj", "{D8869765-AB47-4C03-B2C5-E5498A55CA79}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gnu.Gettext", "Lib\Gnu.Gettext\Gnu.Gettext.csproj", "{859A653A-7728-4F02-BAF2-A5CD8F991916}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.Cs.Web", "Core\Gettext.Cs.Web\Gettext.Cs.Web.csproj", "{38474466-DA21-4D19-A4D8-E2E7918480D6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.DatabaseResourceGenerator", "Tools\Gettext.DatabaseResourceGenerator\Gettext.DatabaseResourceGenerator.csproj", "{B19D8863-C5C2-4A13-B24A-566EB7498D17}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{DF21B331-8022-4958-AEF7-D7897814038A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.Samples.Console", "Samples\Gettext.Samples.Console\Gettext.Samples.Console.csproj", "{470FDBA5-04E5-4A9F-80EA-987D1F8D9074}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.Cs.Tests", "Core\Gettext.Cs.Tests\Gettext.Cs.Tests.csproj", "{C4B4300B-5B96-4F43-BD7D-517A29693B30}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.Iconv", "Tools\Gettext.Iconv\Gettext.Iconv.csproj", "{7578444A-E104-4D72-94B5-DDCB1DA0D63F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.Samples.Mvc", "Samples\Gettext.Samples.Mvc\Gettext.Samples.Mvc.csproj", "{208D43F3-84E6-45B9-B6CC-6E3F48E42A82}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.Samples.Database", "Samples\Gettext.Samples.Database\Gettext.Samples.Database.csproj", "{9FBD5BA7-BCE6-48FE-9FB7-396F377D1313}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gettext.Samples.Spanish", "Samples\Gettext.Samples.Spanish\Gettext.Samples.Spanish.csproj", "{7404A86D-53FA-4B1B-B6FC-D84EB6F5E2D5}" +EndProject +Global + GlobalSection(TestCaseManagementSettings) = postSolution + CategoryFile = Gettext.CsUtils.vsmdi + EndGlobalSection + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {379BC478-7D84-4E0E-A4B8-197905C824AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {379BC478-7D84-4E0E-A4B8-197905C824AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {379BC478-7D84-4E0E-A4B8-197905C824AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {379BC478-7D84-4E0E-A4B8-197905C824AE}.Release|Any CPU.Build.0 = Release|Any CPU + {88A09FE2-5DE0-4C6E-9C4C-BB5E8A490CF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {88A09FE2-5DE0-4C6E-9C4C-BB5E8A490CF5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {88A09FE2-5DE0-4C6E-9C4C-BB5E8A490CF5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {88A09FE2-5DE0-4C6E-9C4C-BB5E8A490CF5}.Release|Any CPU.Build.0 = Release|Any CPU + {F72A7CBA-E656-4ECA-97F9-2B601E0BCDF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F72A7CBA-E656-4ECA-97F9-2B601E0BCDF9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F72A7CBA-E656-4ECA-97F9-2B601E0BCDF9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F72A7CBA-E656-4ECA-97F9-2B601E0BCDF9}.Release|Any CPU.Build.0 = Release|Any CPU + {11BDD346-EDFA-439D-A42D-A1D4FDB64C9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {11BDD346-EDFA-439D-A42D-A1D4FDB64C9A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {11BDD346-EDFA-439D-A42D-A1D4FDB64C9A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {11BDD346-EDFA-439D-A42D-A1D4FDB64C9A}.Release|Any CPU.Build.0 = Release|Any CPU + {D8869765-AB47-4C03-B2C5-E5498A55CA79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D8869765-AB47-4C03-B2C5-E5498A55CA79}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D8869765-AB47-4C03-B2C5-E5498A55CA79}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D8869765-AB47-4C03-B2C5-E5498A55CA79}.Release|Any CPU.Build.0 = Release|Any CPU + {859A653A-7728-4F02-BAF2-A5CD8F991916}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {859A653A-7728-4F02-BAF2-A5CD8F991916}.Debug|Any CPU.Build.0 = Debug|Any CPU + {859A653A-7728-4F02-BAF2-A5CD8F991916}.Release|Any CPU.ActiveCfg = Release|Any CPU + {859A653A-7728-4F02-BAF2-A5CD8F991916}.Release|Any CPU.Build.0 = Release|Any CPU + {38474466-DA21-4D19-A4D8-E2E7918480D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {38474466-DA21-4D19-A4D8-E2E7918480D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38474466-DA21-4D19-A4D8-E2E7918480D6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {38474466-DA21-4D19-A4D8-E2E7918480D6}.Release|Any CPU.Build.0 = Release|Any CPU + {B19D8863-C5C2-4A13-B24A-566EB7498D17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B19D8863-C5C2-4A13-B24A-566EB7498D17}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B19D8863-C5C2-4A13-B24A-566EB7498D17}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B19D8863-C5C2-4A13-B24A-566EB7498D17}.Release|Any CPU.Build.0 = Release|Any CPU + {470FDBA5-04E5-4A9F-80EA-987D1F8D9074}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {470FDBA5-04E5-4A9F-80EA-987D1F8D9074}.Debug|Any CPU.Build.0 = Debug|Any CPU + {470FDBA5-04E5-4A9F-80EA-987D1F8D9074}.Release|Any CPU.ActiveCfg = Release|Any CPU + {470FDBA5-04E5-4A9F-80EA-987D1F8D9074}.Release|Any CPU.Build.0 = Release|Any CPU + {C4B4300B-5B96-4F43-BD7D-517A29693B30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C4B4300B-5B96-4F43-BD7D-517A29693B30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C4B4300B-5B96-4F43-BD7D-517A29693B30}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C4B4300B-5B96-4F43-BD7D-517A29693B30}.Release|Any CPU.Build.0 = Release|Any CPU + {7578444A-E104-4D72-94B5-DDCB1DA0D63F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7578444A-E104-4D72-94B5-DDCB1DA0D63F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7578444A-E104-4D72-94B5-DDCB1DA0D63F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7578444A-E104-4D72-94B5-DDCB1DA0D63F}.Release|Any CPU.Build.0 = Release|Any CPU + {208D43F3-84E6-45B9-B6CC-6E3F48E42A82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {208D43F3-84E6-45B9-B6CC-6E3F48E42A82}.Debug|Any CPU.Build.0 = Debug|Any CPU + {208D43F3-84E6-45B9-B6CC-6E3F48E42A82}.Release|Any CPU.ActiveCfg = Release|Any CPU + {208D43F3-84E6-45B9-B6CC-6E3F48E42A82}.Release|Any CPU.Build.0 = Release|Any CPU + {9FBD5BA7-BCE6-48FE-9FB7-396F377D1313}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9FBD5BA7-BCE6-48FE-9FB7-396F377D1313}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9FBD5BA7-BCE6-48FE-9FB7-396F377D1313}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9FBD5BA7-BCE6-48FE-9FB7-396F377D1313}.Release|Any CPU.Build.0 = Release|Any CPU + {7404A86D-53FA-4B1B-B6FC-D84EB6F5E2D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7404A86D-53FA-4B1B-B6FC-D84EB6F5E2D5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7404A86D-53FA-4B1B-B6FC-D84EB6F5E2D5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7404A86D-53FA-4B1B-B6FC-D84EB6F5E2D5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {88A09FE2-5DE0-4C6E-9C4C-BB5E8A490CF5} = {FD8EF9F6-9B97-456A-98E0-E94DB2BD3EED} + {F72A7CBA-E656-4ECA-97F9-2B601E0BCDF9} = {FD8EF9F6-9B97-456A-98E0-E94DB2BD3EED} + {11BDD346-EDFA-439D-A42D-A1D4FDB64C9A} = {FD8EF9F6-9B97-456A-98E0-E94DB2BD3EED} + {B19D8863-C5C2-4A13-B24A-566EB7498D17} = {FD8EF9F6-9B97-456A-98E0-E94DB2BD3EED} + {7578444A-E104-4D72-94B5-DDCB1DA0D63F} = {FD8EF9F6-9B97-456A-98E0-E94DB2BD3EED} + {379BC478-7D84-4E0E-A4B8-197905C824AE} = {64737816-54EF-4891-A58D-0642F07F09AD} + {859A653A-7728-4F02-BAF2-A5CD8F991916} = {64737816-54EF-4891-A58D-0642F07F09AD} + {D8869765-AB47-4C03-B2C5-E5498A55CA79} = {380A3584-88CB-4153-9BC1-C18CFAE9EF26} + {38474466-DA21-4D19-A4D8-E2E7918480D6} = {380A3584-88CB-4153-9BC1-C18CFAE9EF26} + {C4B4300B-5B96-4F43-BD7D-517A29693B30} = {380A3584-88CB-4153-9BC1-C18CFAE9EF26} + {470FDBA5-04E5-4A9F-80EA-987D1F8D9074} = {DF21B331-8022-4958-AEF7-D7897814038A} + {208D43F3-84E6-45B9-B6CC-6E3F48E42A82} = {DF21B331-8022-4958-AEF7-D7897814038A} + {9FBD5BA7-BCE6-48FE-9FB7-396F377D1313} = {DF21B331-8022-4958-AEF7-D7897814038A} + {7404A86D-53FA-4B1B-B6FC-D84EB6F5E2D5} = {DF21B331-8022-4958-AEF7-D7897814038A} + EndGlobalSection +EndGlobal diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/AssemblyInfo.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/AssemblyInfo.cs new file mode 100644 index 00000000..c22a6b26 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/AssemblyInfo.cs @@ -0,0 +1,88 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security.Permissions; + +// +// 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("GNU Getopt Argument Parser")] +[assembly: AssemblyDescription("This is a C# port of a Java port of GNU " + + "Getopt, a class for parsing command line arguments passed to programs. " + + "It is based on the C getopt() functions in glibc 2.0.6 and should " + + "parse options in a 100% compatible manner.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Free Software Foundation, Inc.")] +[assembly: AssemblyProduct("GNU Getopt")] +[assembly: AssemblyCopyright("Copyright (c) 1987-1997 Free Software " + + "Foundation, Inc., Java Port Copyright (c) 1998 by Aaron M. Renn " + + "(arenn@urbanophile.com), C#.NET Port of the Java Port Copyright (c) " + + "2004 by Klaus Prückl (klaus.prueckl@aon.at)")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// 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: + +[assembly: AssemblyVersion("0.9.1.*")] + +// +// 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:CLSCompliant(true)] +[assembly:ComVisible(true)] \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/Getopt.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/Getopt.cs new file mode 100644 index 00000000..b159a172 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/Getopt.cs @@ -0,0 +1,1417 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +/************************************************************************** +/* Getopt.cs -- C#.NET port of Java port of GNU getopt from glibc 2.0.6 +/* +/* Copyright (c) 1987-1997 Free Software Foundation, Inc. +/* Java Port Copyright (c) 1998 by Aaron M. Renn (arenn@urbanophile.com) +/* C#.NET Port Copyright (c) 2004 by Klaus Prückl (klaus.prueckl@aon.at) +/* +/* This program is free software; you can redistribute it and/or modify +/* it under the terms of the GNU Library General Public License as published +/* by the Free Software Foundation; either version 2 of the License or +/* (at your option) any later version. +/* +/* This program is distributed in the hope that it will be useful, but +/* WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU Library General Public License for more details. +/* +/* You should have received a copy of the GNU Library General Public License +/* along with this program; see the file COPYING.LIB. If not, write to +/* the Free Software Foundation Inc., 59 Temple Place - Suite 330, +/* Boston, MA 02111-1307 USA +/**************************************************************************/ + +using System; +using System.Configuration; +using System.Globalization; +using System.Reflection; +using System.Resources; + +namespace Gnu.Getopt +{ + /// + /// This is a C# port of a Java port of GNU getopt, a class for parsing + /// command line arguments passed to programs. It it based on the C + /// getopt() functions in glibc 2.0.6 and should parse options in a 100% + /// compatible manner. If it does not, that is a bug. The programmer's + /// interface is also very compatible. + /// + /// + /// To use Getopt, create a Getopt object with a args array passed to the + /// main method, then call the method in a loop. It + /// will return an that contains the value of the option + /// character parsed from the command line. When there are no more options + /// to be parsed, it returns -1. + /// + /// A command line option can be defined to take an argument. If an option + /// has an argument, the value of that argument is stored in an instance + /// variable called optarg, which can be accessed using the + /// property. + /// If an option that requires an argument is found, but there is no + /// argument present, then an error message is printed. Normally + /// returns a '?' in this situation, but that + /// can be changed as described below. + /// + /// + /// If an invalid option is encountered, an error message is printed to + /// the standard error and returns a '?'. + /// The value of the invalid option encountered is stored in the instance + /// variable optopt which can be retrieved using the + /// property. + /// To suppress the printing of error messages for this or any other error, + /// set the value of the opterr instance variable to false using the + /// property. + /// + /// + /// Between calls to , the instance variable + /// optind is used to keep track of where the object is in the + /// parsing process. After all options have been returned, optind + /// is the index in argv of the first non-option argument. + /// This variable can be accessed with the property. + /// + /// + /// Note that this object expects command line options to be passed in the + /// traditional Unix manner. That is, proceeded by a '-' character. + /// Multiple options can follow the '-'. For example "-abc" + /// is equivalent to "-a -b -c". If an option takes a required + /// argument, the value of the argument can immediately follow the option + /// character or be present in the next argv element. For example, + /// "-cfoo" and "-c foo" both represent an option character + /// of 'c' with an argument of "foo" assuming c takes + /// a required argument. + /// If an option takes an argument that is not required, then any argument + /// must immediately follow the option character in the same argv element. + /// For example, if c takes a non-required argument, then "-cfoo" + /// represents option character 'c' with an argument of "foo" + /// while "-c foo" represents the option character 'c' with + /// no argument, and a first non-option argv element of "foo". + /// + /// + /// The user can stop from scanning any further into + /// a command line by using the special argument "--" by itself. + /// For example: + /// "-a -- -d" would return an option character of 'a', then + /// return -1. + /// The "--" is discarded and "-d" is pointed to by + /// optind as the first non-option argv element. + /// + /// + /// Here is a basic example of using Getopt: + /// + /// Getopt g = new Getopt("testprog", args, "ab:c::d"); + /// + /// int c; + /// string arg; + /// while ((c = g.getopt()) != -1) + /// { + /// switch(c) + /// { + /// case 'a': + /// case 'd': + /// Console.WriteLine("You picked " + (char)c ); + /// break; + /// + /// case 'b': + /// case 'c': + /// arg = g.Optarg; + /// Console.WriteLine("You picked " + (char)c + + /// " with an argument of " + + /// ((arg != null) ? arg : "null") ); + /// break; + /// + /// case '?': + /// break; // getopt() already printed an error + /// + /// default: + /// Console.WriteLine("getopt() returned " + c); + /// break; + /// } + /// } + /// + /// In this example, a new Getopt object is created with three params. The + /// first param is the program name. This is for printing error messages in + /// the form "program: error message". In the C version, this value is + /// taken from argv[0], but in .NET the program name is not passed in that + /// element, thus the need for this parameter. The second param is the + /// argument list that was passed to the main() method. The third param is + /// the list of valid options. Each character represents a valid option. If + /// the character is followed by a single colon, then that option has a + /// required argument. If the character is followed by two colons, then + /// that option has an argument that is not required. + /// + /// Note in this example that the value returned from + /// is cast to a char prior to printing. This is required in order to make + /// the value display correctly as a character instead of an integer. + /// + /// + /// If the first character in the option string is a colon, for example + /// ":abc::d", then will return a ':' + /// instead of a '?' when it encounters an option with a missing + /// required argument. This allows the caller to distinguish between + /// invalid options and valid options that are simply incomplete. + /// + /// In the traditional Unix getopt(), -1 is returned when the first + /// non-option charcter is encountered. In GNU getopt(), the default + /// behavior is to allow options to appear anywhere on the command line. + /// The method permutes the argument to make it appear + /// to the caller that all options were at the beginning of the command + /// line, and all non-options were at the end. For example, calling + /// with command line argv of "-a foo bar -d" + /// returns options 'a' and 'd', then sets optind to point to + /// "foo". The program would read the last two argv elements as + /// "foo" and "bar", just as if the user had typed + /// "-a -d foo bar". + /// + /// + /// The user can force to stop scanning the command + /// line with the special argument "--" by itself. Any elements + /// occuring before the "--" are scanned and permuted as normal. Any + /// elements after the "--" are returned as is as non-option argv + /// elements. For example, "foo -a -- bar -d" would return option + /// 'a' then -1. optind would point to "foo", + /// "bar" and "-d" as the non-option argv elements. The + /// "--" is discarded by . + /// + /// + /// There are two ways this default behavior can be modified. The first is + /// to specify traditional Unix getopt() behavior (which is also POSIX + /// behavior) in which scanning stops when the first non-option argument + /// encountered. (Thus "-a foo bar -d" would return 'a' as an + /// option and have "foo", "bar", and "-d" as + /// non-option elements). + /// The second is to allow options anywhere, but to return all elements in + /// the order they occur on the command line. + /// When a non-option element is ecountered, an integer 1 is returned and + /// the value of the non-option element is stored in optarg is if + /// it were the argument to that option. + /// For example, "-a foo -d", returns first 'a', then 1 (with + /// optarg set to "foo") then 'd' then -1. + /// When this "return in order" functionality is enabled, the only way to + /// stop getopt from scanning all command line elements is to + /// use the special "--" string by itself as described above. An + /// example is "-a foo -b -- bar", which would return 'a', + /// then integer 1 with optarg set to "foo", then 'b', + /// then -1. + /// optind would then point to "bar" as the first non-option + /// argv element. The "--" is discarded. + /// + /// + /// The POSIX/traditional behavior is enabled by either setting the + /// application setting "Gnu.PosixlyCorrect" or by putting a '+' + /// sign as the first character of the option string. + /// The difference between the two methods is that setting the + /// "Gnu.PosixlyCorrect" application setting also forces certain error + /// messages to be displayed in POSIX format. + /// To enable the "return in order" functionality, put a '-' as the + /// first character of the option string. Note that after determining the + /// proper behavior, Getopt strips this leading '+' or '-', + /// meaning that a ':' placed as the second character after one of + /// those two will still cause to return a ':' + /// instead of a '?' if a required option argument is missing. + /// + /// + /// In addition to traditional single character options, GNU Getopt also + /// supports long options. These are preceeded by a "--" sequence + /// and can be as long as desired. Long options provide a more + /// user-friendly way of entering command line options. + /// For example, in addition to a "-h" for help, a program could + /// support also "--help". + /// + /// + /// Like short options, long options can also take a required or + /// non-required argument. Required arguments can either be specified by + /// placing an equals sign after the option name, then the argument, or by + /// putting the argument in the next argv element. For example: + /// "--outputdir=foo" and "--outputdir foo" both represent an + /// option of "outputdir" with an argument of "foo", assuming + /// that outputdir takes a required argument. If a long option takes a + /// non-required argument, then the equals sign form must be used to + /// specify the argument. In this case, "--outputdir=foo" would + /// represent option outputdir with an argument of foo while + /// "--outputdir foo" would represent the option outputdir with no + /// argument and a first non-option argv element of "foo". + /// + /// + /// Long options can also be specified using a special POSIX argument + /// format (one that I highly discourage). This form of entry is enabled by + /// placing a "W;" (yes, 'W' then a semi-colon) in the valid + /// option string. + /// This causes getopt to treat the name following the "-W" as the + /// name of the long option. For example, "-W outputdir=foo" would + /// be equivalent to "--outputdir=foo". The name can immediately + /// follow the "-W" like so: "-Woutputdir=foo". + /// Option arguments are handled identically to normal long options. If a + /// string follows the "-W" that does not represent a + /// valid long option, then returns 'W' and + /// the caller must decide what to do. Otherwise + /// returns a long option value as described below. + /// + /// + /// While long options offer convenience, they can also be tedious to type + /// in full. So it is permissible to abbreviate the option name to as few + /// characters as required to uniquely identify it. If the name can + /// represent multiple long options, then an error message is printed and + /// returns a '?'. + /// + /// + /// If an invalid option is specified or a required option argument is + /// missing, prints an error and returns a '?' + /// or ':' exactly as for short options. + /// Note that when an invalid long option is encountered, the optopt + /// variable is set to integer 0 and so cannot be used to identify the + /// incorrect option the user entered. + /// + /// + /// Long options are defined by objects. These + /// objects are created with a contructor that takes four params: a string + /// representing the object name, a integer specifying what arguments the + /// option takes (the value is one of the + /// enumeration: , + /// , or ), + /// a flag object (described + /// below), and an integer value (described below). + /// + /// + /// To enable long option parsing, create an array of + /// 's representing the legal options and pass it to + /// the Getopt() constructor. + /// WARNING: If all elements of the array are not populated with + /// objects, the method will + /// throw a . + /// + /// + /// When is called and a long option is encountered, + /// one of two things can be returned. + /// If the flag field in the object representing the + /// long option is non-null, then the integer value field is stored there + /// and an integer 0 is returned to the caller. + /// The val field can then be retrieved from the flag field. + /// Note that since the flag field is a + /// , the appropriate string to + /// integer converions must be performed in order to get the actual int + /// value stored there. + /// If the flag field in the object is null, + /// then the value field of the is returned. + /// This can be the character of a short option. + /// This allows an app to have both a long and short option sequence (say, + /// "-h" and "--help") that do the exact same thing. + /// + /// + /// With long options, there is an alternative method of determining which + /// option was selected. The property Longind will return the index in the + /// long option array (NOT argv) of the long option found. So if multiple + /// long options are configured to return the same value, the application + /// can use to distinguish between them. + /// + /// + /// Here is an expanded Getopt example using long options and various + /// techniques described above: + /// + /// int c; + /// string arg; + /// LongOpt[] longopts = new LongOpt[3]; + /// + /// StringBuffer sb = new StringBuffer(); + /// longopts[0] = new LongOpt("help", LongOpt.NO_ARGUMENT, null, 'h'); + /// longopts[1] = new LongOpt("outputdir", LongOpt.REQUIRED_ARGUMENT, sb, 'o'); + /// longopts[2] = new LongOpt("maximum", LongOpt.OPTIONAL_ARGUMENT, null, 2); + /// + /// Getopt g = new Getopt("testprog", argv, "-:bc::d:hW;", longopts); + /// g.Opterr = false; // We'll do our own error handling + /// + /// while ((c = g.getopt()) != -1) + /// switch (c) + /// { + /// case 0: + /// arg = g.getOptarg(); + /// Console.WriteLine("Got long option with value '" + + /// (char)(new Integer(sb.toString())).intValue() + /// + "' with argument " + + /// ((arg != null) ? arg : "null")); + /// break; + /// + /// case 1: + /// Console.WriteLine("I see you have return in order set and that " + + /// "a non-option argv element was just found " + + /// "with the value '" + g.Optarg + "'"); + /// break; + /// + /// case 2: + /// arg = g.getOptarg(); + /// Console.WriteLine("I know this, but pretend I didn't"); + /// Console.WriteLine("We picked option " + + /// longopts[g.Longind].getName() + + /// " with value " + + /// ((arg != null) ? arg : "null")); + /// break; + /// + /// case 'b': + /// Console.WriteLine("You picked plain old option " + (char)c); + /// break; + /// + /// case 'c': + /// case 'd': + /// arg = g.getOptarg(); + /// Console.WriteLine("You picked option '" + (char)c + + /// "' with argument " + + /// ((arg != null) ? arg : "null")); + /// break; + /// + /// case 'h': + /// Console.WriteLine("I see you asked for help"); + /// break; + /// + /// case 'W': + /// Console.WriteLine("Hmmm. You tried a -W with an incorrect long " + + /// "option name"); + /// break; + /// + /// case ':': + /// Console.WriteLine("Doh! You need an argument for option " + + /// (char)g.getOptopt()); + /// break; + /// + /// case '?': + /// Console.WriteLine("The option '" + (char)g.getOptopt() + + /// "' is not valid"); + /// break; + /// + /// default: + /// Console.WriteLine("getopt() returned " + c); + /// break; + /// } + /// + /// for (int i = g.getOptind(); i < argv.length ; i++) + /// Console.WriteLine("Non option argv element: " + argv[i] ); + /// + /// + /// There is an alternative form of the constructor used for long options + /// above. This takes a trailing boolean flag. If set to false, Getopt + /// performs identically to the example, but if the boolean flag is true + /// then long options are allowed to start with a single '-' instead + /// of "--". If the first character of the option is a valid short + /// option character, then the option is treated as if it were the short + /// option. Otherwise it behaves as if the option is a long option. + /// Note that the name given to this option - longOnly - is very + /// counter-intuitive. + /// It does not cause only long options to be parsed but instead enables + /// the behavior described above. + /// + /// + /// + /// Note that the functionality and variable names used are driven from the + /// C lib version as this object is a port of the C code, not a new + /// implementation. This should aid in porting existing C/C++ code, as well + /// as helping programmers familiar with the glibc version to adapt to the + /// C#.NET version. + /// + /// + /// Roland McGrath (roland@gnu.ai.mit.edu) + /// Ulrich Drepper (drepper@cygnus.com) + /// Aaron M. Renn (arenn@urbanophile.com) + /// Klaus Prückl (klaus.prueckl@aon.at) + /// LongOpt + public class Getopt + { + /// + /// Describe how to deal with options that follow non-option + /// ARGV-elements. + /// + /// If the caller did not specify anything, the default is RequireOrder + /// if the application setting Gnu.PosixlyCorrect is defined, Permute + /// otherwise. + /// + /// The special argument "--" forces an end of option-scanning + /// regardless of the value of ordering. In the case of + /// ReturnInOrder, only -- can cause to + /// return -1 with optind != argv.Length. + /// + private enum Order + { + /// + /// RequireOrder means don't recognize them as options; stop option + /// processing when the first non-option is seen. This is what Unix + /// does. This mode of operation is selected by either setting the + /// application setting Gnu.PosixlyCorrect, or using '+' as + /// the first character of the list of option characters. + /// + RequireOrder = 1, + /// + /// Permute is the default. We permute the contents of ARGV as we + /// scan, so that eventually all the non-options are at the end. + /// This allows options to be given in any order, even with + /// programs that were not written to expect this. + /// + Permute = 2, + /// + /// ReturnInOrder is an option available to programs that were + /// written to expect options and other ARGV-elements in any order + /// and that care about the ordering of the two. We describe each + /// non-option ARGV-element as if it were the argument of an option + /// with character code 1. Using '-' as the first character + /// of the list of option characters selects this mode of + /// operation. + /// + ReturnInOrder = 3 + } + + #region Instance Variables + /// + /// For communication from to the caller. When + /// finds an option that takes an argument, the + /// argument value is returned here. Also, when ordering is + /// , each non-option ARGV-element is + /// returned here. + /// + private string optarg; + + /// + /// Index in ARGV of the next element to be scanned. This is used for + /// communication to and from the caller and for communication between + /// successive calls to . + /// + /// On entry to , zero means this is the first + /// call; initialize. + /// + /// When returns -1, this is the index of the + /// first of the non-option elements that the caller should itself + /// scan. + /// + /// Otherwise, communicates from one call to the + /// next how much of ARGV has been scanned so far. + /// + private int optind = 0; + + /// + /// Callers store false here to inhibit the error message for + /// unrecognized options. + /// + private bool opterr = true; + + /// + /// When an unrecognized option is encountered, getopt will return a + /// '?' and store the value of the invalid option here. + /// + private int optopt = '?'; + + /// + /// The next char to be scanned in the option-element in which the last + /// option character we returned was found. This allows us to pick up + /// the scan where we left off. + /// + /// If this is zero, or a null string, it means resume the scan by + /// advancing to the next ARGV-element. + /// + private string nextchar; + + /// + /// This is the string describing the valid short options. + /// + private string optstring; + + /// + /// This is an array of objects which describ the + /// valid long options. + /// + private LongOpt[] longOptions; + + /// + /// This flag determines whether or not we are parsing only long args. + /// + private bool longOnly; + + /// + /// Stores the index into the longOptions array of the long + /// option found. + /// + private int longind; + + /// + /// The flag determines whether or not we operate in strict POSIX + /// compliance. + /// + private bool posixlyCorrect; + + /// + /// A flag which communicates whether or not + /// did all necessary processing for the + /// current option. + /// + private bool longoptHandled; + + /// + /// The index of the first non-option in argv[]. + /// + private int firstNonopt = 1; + + /// + /// The index of the last non-option in argv[]. + /// + private int lastNonopt = 1; + + /// + /// Flag to tell to immediately return -1 the next + /// time it is called. + /// + private bool endparse = false; + + /// + /// Saved argument list passed to the program. + /// + private string[] argv; + + /// + /// Determines whether we permute arguments or not. + /// + private Order ordering; + + /// + /// Name to print as the program name in error messages. This is + /// necessary since .NET does not place the program name in args[0]. + /// + private string progname; + + /// + /// The localized strings are kept in the resources, which can be + /// accessed by the class. + /// + private ResourceManager resManager = new ResourceManager( + "Gnu.Getopt.MessagesBundle", Assembly.GetExecutingAssembly()); + + /// + /// The current UI culture (set to en-US when posixly correctness is + /// enabled). + /// + private CultureInfo cultureInfo = CultureInfo.CurrentUICulture; + + #endregion + + #region Constructors + /// + /// Construct a basic Getopt instance with the given input data. Note + /// that this handles short options only. + /// + /// + /// The name to display as the program name when printing errors. + /// + /// + /// The string array passed as the command line to the program. + /// + /// + /// A string containing a description of the valid args for this + /// program. + /// + public Getopt(string progname, string[] argv, string optstring) : + this(progname, argv, optstring, null, false) + { + } + + /// + /// Construct a Getopt instance with given input data that is capable + /// of parsing long options as well as short. + /// + /// + /// The name to display as the program name when printing errors. + /// + /// + /// The string array passed as the command ilne to the program. + /// + /// + /// A string containing a description of the valid short args for this + /// program. + /// + /// + /// An array of objects that describes the valid + /// long args for this program. + /// + public Getopt(string progname, string[] argv, string optstring, + LongOpt[] longOptions) : this(progname, argv, optstring, + longOptions, false) + { + } + + /// + /// Construct a Getopt instance with given input data that is capable + /// of parsing long options and short options. Contrary to what you + /// might think, the flag does not + /// determine whether or not we scan for only long arguments. Instead, + /// a value of true here allows long arguments to start with a + /// '-' instead of "--" unless there is a conflict with + /// a short option name. + /// + /// + /// The name to display as the program name when printing errors + /// + /// + /// The string array passed as the command ilne to the program. + /// + /// + /// A string containing a description of the valid short args for this + /// program. + /// + /// + /// An array of objects that describes the valid + /// long args for this program. + /// + /// + /// true if long options that do not conflict with short options can + /// start with a '-' as well as "--". + /// + public Getopt(string progname, string[] argv, string optstring, + LongOpt[] longOptions, bool longOnly) + { + if (optstring.Length == 0) + optstring = " "; + + // This function is essentially _getopt_initialize from GNU getopt + this.progname = progname; + this.argv = argv; + this.optstring = optstring; + this.longOptions = longOptions; + this.longOnly = longOnly; + + // Check for application setting "Gnu.PosixlyCorrect" to determine + // whether to strictly follow the POSIX standard. This replaces the + // "POSIXLY_CORRECT" environment variable in the C version + try + { + if((bool) new AppSettingsReader().GetValue( + "Gnu.PosixlyCorrect", typeof(bool))) + { + this.posixlyCorrect = true; + this.cultureInfo = new CultureInfo("en-US"); + } + else + this.posixlyCorrect = false; + } + catch(Exception) + { + this.posixlyCorrect = false; + } + + // Determine how to handle the ordering of options and non-options + if (optstring[0] == '-') + { + this.ordering = Order.ReturnInOrder; + if (optstring.Length > 1) + this.optstring = optstring.Substring(1); + } + else if (optstring[0] == '+') + { + this.ordering = Order.RequireOrder; + if (optstring.Length > 1) + this.optstring = optstring.Substring(1); + } + else if (this.posixlyCorrect) + { + this.ordering = Order.RequireOrder; + } + else + { + this.ordering = Order.Permute; // The normal default case + } + } + #endregion + + #region Instance Methods + /// + /// In GNU getopt, it is possible to change the string containg valid + /// options on the fly because it is passed as an argument to + /// each time. + /// In this version we do not pass the string on every call. + /// In order to allow dynamic option string changing, this method is + /// provided. + /// + public string Optstring + { + get { return this.optstring; } + set + { + if (value.Length == 0) + value = " "; + + this.optstring = value; + } + } + + /// + /// optind is the index in ARGV of the next element to be + /// scanned. This is used for communication to and from the caller and + /// for communication between successive calls to . + /// + /// When returns -1, this is the index of the + /// first of the non-option elements that the caller should itself + /// scan. + /// + /// Otherwise, optind communicates from one call to the next how + /// much of ARGV has been scanned so far. + /// + /// + /// This method allows the optind index to be set manually. + /// Normally this is not necessary (and incorrect usage of this method + /// can lead to serious lossage), but optind is a public symbol + /// in GNU getopt, so this method was added to allow it to be modified + /// by the caller if desired. + /// + public int Optind + { + get { return this.optind; } + set { this.optind = value; } + } + + /// + /// Since in GNU getopt() the argument vector is passed back in to the + /// function every time, the caller can swap out argv on the + /// fly. Since passing argv is not required in the .NET version, this + /// method allows the user to override argv. Note that incorrect use of + /// this method can lead to serious lossage. + /// + public string[] Argv + { + get { return this.argv; } + set { this.argv = value; } + } + + /// + /// For communication from to the caller. When + /// finds an option that takes an argument, the + /// argument value is returned here. Also, when ordering is + /// , each non-option ARGV-element is + /// returned here. No set method is provided because setting this + /// variable has no effect. + /// + public string Optarg + { + get { return this.optarg; } + } + + /// + /// Normally will print a message to the standard + /// error when an invalid option is encountered. This can be suppressed + /// (or re-enabled) by calling this method. + /// + public bool Opterr + { + get { return this.opterr; } + set { this.opterr = value; } + } + + /// + /// When encounters an invalid option, it stores + /// the value of that option in optopt which can be retrieved + /// with this method. There is no corresponding set method because + /// setting this variable has no effect. + /// + public int Optopt + { + get { return this.optopt; } + } + + /// + /// Returns the index into the array of long options (NOT argv) + /// representing the long option that was found. + /// + public int Longind + { + get { return this.longind; } + } + + /// + /// Exchange the shorter segment with the far end of the longer + /// segment. That puts the shorter segment into the right place. It + /// leaves the longer segment in the right place overall, but it + /// consists of two parts that need to be swapped next. This method is + /// used by for argument permutation. + /// + private void exchange(string[] argv) + { + int bottom = this.firstNonopt; + int middle = this.lastNonopt; + int top = this.optind; + string tem; + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + // Bottom segment is the short one. + int len = middle - bottom; + int i; + + // Swap it with the top part of the top segment. + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + } + // Exclude the moved bottom segment from further swapping. + top -= len; + } + else + { + // Top segment is the short one. + int len = top - middle; + int i; + + // Swap it with the bottom part of the bottom segment. + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + } + // Exclude the moved top segment from further swapping. + bottom += len; + } + } + + // Update records for the slots the non-options now occupy. + + this.firstNonopt += (this.optind - this.lastNonopt); + this.lastNonopt = this.optind; + } + + /// + /// Check to see if an option is a valid long option. Called by + /// . Put in a separate method because this needs + /// to be done twice. (The C getopt authors just copy-pasted the + /// code!). + /// + /// + /// Various things depending on circumstances + /// + private int checkLongOption() + { + LongOpt pfound = null; + int nameend; + bool ambig; + bool exact; + + this.longoptHandled = true; + ambig = false; + exact = false; + this.longind = - 1; + + nameend = this.nextchar.IndexOf("="); + if (nameend == - 1) + nameend = this.nextchar.Length; + + // Test all long options for either exact match or abbreviated + // matches + for (int i = 0; i < this.longOptions.Length; i++) + { + if (this.longOptions[i].Name.StartsWith( + this.nextchar.Substring(0, nameend))) + { + if (this.longOptions[i].Name.Equals( + this.nextchar.Substring(0, nameend))) + { + // Exact match found + pfound = this.longOptions[i]; + this.longind = i; + exact = true; + break; + } + else if (pfound == null) + { + // First nonexact match found + pfound = this.longOptions[i]; + this.longind = i; + } + else + { + // Second or later nonexact match found + ambig = true; + } + } + } // for + + // Print out an error if the option specified was ambiguous + if (ambig && !exact) + { + if (this.opterr) + { + object[] msgArgs = new object[]{ + this.progname, this.argv[optind] }; + System.Console.Error.WriteLine( + this.resManager.GetString("getopt.ambigious", + this.cultureInfo), msgArgs); + } + + this.nextchar = ""; + this.optopt = 0; + ++this.optind; + + return '?'; + } + + if (pfound != null) + { + ++this.optind; + + if (nameend != this.nextchar.Length) + { + if (pfound.HasArg != Argument.No) + { + if (this.nextchar.Substring(nameend).Length > 1) + this.optarg = this.nextchar.Substring(nameend + 1); + else + this.optarg = ""; + } + else + { + if (this.opterr) + { + // -- option + if (argv[this.optind - 1].StartsWith("--")) + { + object[] msgArgs = new object[]{ + this.progname, pfound.Name }; + System.Console.Error.WriteLine( + this.resManager.GetString( + "getopt.arguments1", this.cultureInfo), + msgArgs); + } + // +option or -option + else + { + object[] msgArgs = new object[]{ this.progname, + this.argv[optind - 1][0], pfound.Name}; + System.Console.Error.WriteLine( + this.resManager.GetString( + "getopt.arguments2", this.cultureInfo), + msgArgs); + } + } + + this.nextchar = ""; + this.optopt = pfound.Val; + + return '?'; + } + } // if (nameend) + else if (pfound.HasArg == Argument.Required) + { + if (this.optind < this.argv.Length) + { + this.optarg = this.argv[this.optind]; + ++this.optind; + } + else + { + if (this.opterr) + { + object[] msgArgs = new object[]{ + this.progname, this.argv[this.optind - 1]}; + System.Console.Error.WriteLine( + this.resManager.GetString("getopt.requires", + this.cultureInfo), msgArgs); + } + + this.nextchar = ""; + this.optopt = pfound.Val; + if (this.optstring[0] == ':') + return ':'; + else + return '?'; + } + } // else if (pfound) + + this.nextchar = ""; + + if (pfound.Flag != null) + { + pfound.Flag.Length = 0; + pfound.Flag.Append(pfound.Val); + + return 0; + } + + return pfound.Val; + } // if (pfound != null) + + this.longoptHandled = false; + + return 0; + } + + /// + /// This method returns a char that is the current option that has been + /// parsed from the command line. If the option takes an argument, then + /// the internal variable optarg is set which is a string + /// representing the the value of the argument. This value can be + /// retrieved by the caller using the property. If + /// an invalid option is found, an error message is printed and a + /// '?' is returned. + /// The name of the invalid option character can be retrieved by + /// calling the Optopt property. When there are no more options + /// to be scanned, this method returns -1. The index of first + /// non-option element in argv can be retrieved with the + /// property. + /// + /// + /// Various things as described above. + /// + public int getopt() // not capitalized because of an compiler error + { + this.optarg = null; + + if (this.endparse == true) + return -1; + + if ((this.nextchar == null) || (this.nextchar.Length == 0)) + { + // If we have just processed some options following some + // non-options, exchange them so that the options come first. + if (this.lastNonopt > this.optind) + this.lastNonopt = this.optind; + if (this.firstNonopt > this.optind) + this.firstNonopt = this.optind; + + if (this.ordering == Order.Permute) + { + // If we have just processed some options following some + // non-options, exchange them so that the options come + // first. + if ((this.firstNonopt != this.lastNonopt) && + (this.lastNonopt != this.optind)) + this.exchange(this.argv); + else if (this.lastNonopt != this.optind) + this.firstNonopt = this.optind; + + // Skip any additional non-options + // and extend the range of non-options previously skipped. + while ((this.optind < this.argv.Length) && + ((this.argv[optind].Length == 0) || + (this.argv[this.optind][0] != '-') || + this.argv[optind].Equals("-"))) + this.optind++; + + this.lastNonopt = this.optind; + } + + // The special ARGV-element "--" means premature end of + // options. Skip it like a null option, then exchange with + // previous non-options as if it were an option, then skip + // everything else like a non-option. + if ((this.optind != this.argv.Length) && + this.argv[this.optind].Equals("--")) + { + this.optind++; + + if ((this.firstNonopt != this.lastNonopt) && + (this.lastNonopt != this.optind)) + this.exchange(this.argv); + else if (this.firstNonopt == this.lastNonopt) + this.firstNonopt = this.optind; + + this.lastNonopt = this.argv.Length; + + this.optind = this.argv.Length; + } + + // If we have done all the ARGV-elements, stop the scan + // and back over any non-options that we skipped and permuted. + if (this.optind == this.argv.Length) + { + // Set the next-arg-index to point at the non-options that + // we previously skipped, so the caller will digest them. + if (this.firstNonopt != this.lastNonopt) + this.optind = this.firstNonopt; + + return -1; + } + + // If we have come to a non-option and did not permute it, + // either stop the scan or describe it to the caller and pass + // it by. + if ((this.argv[this.optind].Length == 0) || + (this.argv[this.optind][0] != '-') || + this.argv[this.optind].Equals("-")) + { + if (this.ordering == Order.RequireOrder) + return -1; + + this.optarg = this.argv[optind++]; + return 1; + } + + // We have found another option-ARGV-element. + // Skip the initial punctuation. + if (this.argv[optind].StartsWith("--")) + this.nextchar = this.argv[this.optind].Substring(2); + else + this.nextchar = this.argv[this.optind].Substring(1); + } + + // Decode the current option-ARGV-element. + + /* Check whether the ARGV-element is a long option. + + If longOnly and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and the + ARGV-element is "-fu", do consider that an abbreviation of the + long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. + */ + if ((this.longOptions != null) && + (this.argv[this.optind].StartsWith("--") || (this.longOnly && + ((this.argv[this.optind].Length > 2) || + (this.optstring.IndexOf(this.argv[this.optind][1]) == -1))))) + { + int c = this.checkLongOption(); + + if (this.longoptHandled) + return c; + + // Can't find it as a long option. If this is not + // getopt_long_only, or the option starts with "--" or is not a + // valid short option, then it's an error. Otherwise interpret + // it as a short option. + if (!this.longOnly || this.argv[this.optind].StartsWith("--") + || (this.optstring.IndexOf(this.nextchar[0]) == - 1)) + { + if (this.opterr) + { + if (this.argv[this.optind].StartsWith("--")) + { + object[] msgArgs = new object[]{ + this.progname, this.nextchar }; + System.Console.Error.WriteLine( + this.resManager.GetString("getopt.unrecognized", + this.cultureInfo), msgArgs); + } + else + { + object[] msgArgs = new object[]{ this.progname, + this.argv[optind][0], this.nextchar}; + System.Console.Error.WriteLine( + this.resManager.GetString("getopt.unrecognized2", + this.cultureInfo), msgArgs); + } + } + + this.nextchar = ""; + ++this.optind; + this.optopt = 0; + + return '?'; + } + } // if (longopts) + + // Look at and handle the next short option-character */ + int c2 = this.nextchar[0]; //**** Do we need to check for empty str? + if (this.nextchar.Length > 1) + this.nextchar = this.nextchar.Substring(1); + else + this.nextchar = ""; + + string temp = null; + if (this.optstring.IndexOf((char) c2) != - 1) + temp = this.optstring.Substring( + this.optstring.IndexOf((char) c2)); + + if (this.nextchar.Length == 0) + ++this.optind; + + if ((temp == null) || (c2 == ':')) + { + if (this.opterr) + { + if (this.posixlyCorrect) + { + // 1003.2 specifies the format of this message + object[] msgArgs = new object[]{ + this.progname, (char) c2 }; + System.Console.Error.WriteLine( + this.resManager.GetString("getopt.illegal", + this.cultureInfo), msgArgs); + } + else + { + object[] msgArgs = new object[]{ + this.progname, (char) c2 }; + System.Console.Error.WriteLine( + this.resManager.GetString("getopt.invalid", + this.cultureInfo), msgArgs); + } + } + + this.optopt = c2; + + return '?'; + } + + // Convenience. Treat POSIX -W foo same as long option --foo + if ((temp[0] == 'W') && (temp.Length > 1) && (temp[1] == ';')) + { + if (this.nextchar.Length != 0) + { + this.optarg = this.nextchar; + } + // No further cars in this argv element and no more argv + // elements + else if (this.optind == this.argv.Length) + { + if (this.opterr) + { + // 1003.2 specifies the format of this message. + object[] msgArgs = new object[]{ + this.progname, (char) c2 }; + System.Console.Error.WriteLine( + this.resManager.GetString("getopt.requires2", + this.cultureInfo), msgArgs); + } + + this.optopt = c2; + if (this.optstring[0] == ':') + return ':'; + else + return '?'; + } + else + { + // We already incremented `optind' once; increment it again + // when taking next ARGV-elt as argument. + this.nextchar = this.argv[this.optind]; + this.optarg = this.argv[this.optind]; + } + + c2 = this.checkLongOption(); + + if (this.longoptHandled) + return c2; + // Let the application handle it + else + { + this.nextchar = null; + ++this.optind; + return 'W'; + } + } + + if ((temp.Length > 1) && (temp[1] == ':')) + { + if ((temp.Length > 2) && (temp[2] == ':')) + // This is an option that accepts and argument optionally + { + if (this.nextchar.Length != 0) + { + this.optarg = this.nextchar; + ++this.optind; + } + else + { + this.optarg = null; + } + + this.nextchar = null; + } + else + { + if (this.nextchar.Length != 0) + { + this.optarg = this.nextchar; + ++this.optind; + } + else if (this.optind == this.argv.Length) + { + if (this.opterr) + { + // 1003.2 specifies the format of this message + object[] msgArgs = new object[]{ + this.progname, (char) c2}; + System.Console.Error.WriteLine( + this.resManager.GetString("getopt.requires2", + this.cultureInfo), msgArgs); + } + + this.optopt = c2; + + if (this.optstring[0] == ':') + return ':'; + else + return '?'; + } + else + { + this.optarg = this.argv[this.optind]; + ++this.optind; + + // Ok, here's an obscure Posix case. If we have o:, + // and we get -o -- foo, then we're supposed to skip + // the --, end parsing of options, and make foo an + // operand to -o. Only do this in Posix mode. + if (this.posixlyCorrect && this.optarg.Equals("--")) + { + // If end of argv, error out + if (this.optind == this.argv.Length) + { + if (this.opterr) + { + // 1003.2 specifies the format of this + // message + object[] msgArgs = new object[]{ + this.progname, (char) c2}; + System.Console.Error.WriteLine( + this.resManager.GetString( + "getopt.requires2", this.cultureInfo), + msgArgs); + } + + this.optopt = c2; + + if (this.optstring[0] == ':') + return ':'; + else + return '?'; + } + + // Set new optarg and set to end. Don't permute as + // we do on -- up above since we know we aren't in + // permute mode because of Posix. + this.optarg = this.argv[this.optind]; + ++this.optind; + this.firstNonopt = this.optind; + this.lastNonopt = this.argv.Length; + this.endparse = true; + } + } + + this.nextchar = null; + } + } + + return c2; + } + #endregion + } // Class Getopt +} \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/Gnu.Getopt.csproj b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/Gnu.Getopt.csproj new file mode 100644 index 00000000..4a285aa7 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/Gnu.Getopt.csproj @@ -0,0 +1,122 @@ + + + Local + 9.0.21022 + 2.0 + {379BC478-7D84-4E0E-A4B8-197905C824AE} + Debug + AnyCPU + + + + + Gnu.Getopt + + + JScript + Grid + IE50 + false + Library + Gnu.Getopt + OnBuildSuccess + + + + + 0.0 + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + bin\Debug\Gnu.Getopt.XML + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + + + bin\Release\ + false + 285212672 + false + + + TRACE + bin\Release\Gnu.Getopt.XML + false + 4096 + false + + + true + false + false + false + 4 + none + prompt + + + + System + + + + + Code + + + Code + + + Code + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + + + + + + + + \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/LongOpt.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/LongOpt.cs new file mode 100644 index 00000000..b961b19c --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/LongOpt.cs @@ -0,0 +1,239 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +/************************************************************************** +/* LongOpt.cs -- C#.NET port of Long option object for Getopt +/* +/* Copyright (c) 1998 by Aaron M. Renn (arenn@urbanophile.com) +/* C#.NET Port Copyright (c) 2004 by Klaus Prückl (klaus.prueckl@aon.at) +/* +/* This program is free software; you can redistribute it and/or modify +/* it under the terms of the GNU Library General Public License as published +/* by the Free Software Foundation; either version 2 of the License or +/* (at your option) any later version. +/* +/* This program is distributed in the hope that it will be useful, but +/* WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU Library General Public License for more details. +/* +/* You should have received a copy of the GNU Library General Public License +/* along with this program; see the file COPYING.LIB. If not, write to +/* the Free Software Foundation Inc., 59 Temple Place - Suite 330, +/* Boston, MA 02111-1307 USA +/**************************************************************************/ + +using System; +using System.Configuration; +using System.Globalization; +using System.Reflection; +using System.Resources; +using System.Text; + +namespace Gnu.Getopt +{ + /// + /// Constant enumeration values used for the LongOpt hasArg + /// constructor argument. + /// + public enum Argument + { + /// + /// This value indicates that the option takes no argument. + /// + No = 0, + /// + /// This value indicates that the option takes an argument that is + /// required. + /// + Required = 1, + /// + /// This value indicates that the option takes an argument that is + /// optional. + /// + Optional = 2 + } + + /// + /// This object represents the definition of a long option in the C# port + /// of GNU getopt. An array of LongOpt objects is passed to the + /// object to define the list of valid long options + /// for a given parsing session. Refer to the + /// documentation for details on the format of long options. + /// + /// Getopt + /// Aaron M. Renn (arenn@urbanophile.com) + /// Klaus Prückl (klaus.prueckl@aon.at) + public class LongOpt + { + #region Instance Variables + /// + /// The name of the long option. + /// + private string name; + + /// + /// Indicates whether the option has no argument, a required argument, + /// or an optional argument. + /// + private Argument hasArg; + + /// + /// If this variable is not null, then the value stored in val + /// is stored here when this long option is encountered. If this is + /// null, the value stored in val is treated as the name of an + /// equivalent short option. + /// + private StringBuilder flag; + + /// + /// The value to store in flag if flag is not null, otherwise + /// the equivalent short option character for this long option. + /// + private int val; + + /// + /// The localized strings are kept in the resources, which can be + /// accessed by the class. + /// + private ResourceManager resManager = new ResourceManager( + "Gnu.Getopt.MessagesBundle", Assembly.GetExecutingAssembly()); + + /// + /// The current UI culture (set to en-US when posixly correctness is + /// enabled). + /// + private CultureInfo cultureInfo = CultureInfo.CurrentUICulture; + #endregion + + #region Constructors + /// + /// Create a new LongOpt object with the given parameter values. If the + /// value passed as is not valid, then an + /// is thrown. + /// + /// + /// The long option string. + /// + /// + /// Indicates whether the option has no argument + /// (), a required argument + /// () or an optional argument + /// (). + /// + /// + /// If non-null, this is a location to store the value of + /// when this option is encountered, otherwise + /// is treated as the equivalent short option + /// character. + /// + /// + /// The value to return for this long option, or the equivalent single + /// letter option to emulate if flag is null. + /// + /// + /// Is thrown if the param is not one of + /// , or + /// . + /// + public LongOpt(string name, Argument hasArg, StringBuilder flag, + int val) + { + // Check for application setting "Gnu.PosixlyCorrect" to determine + // whether to strictly follow the POSIX standard. This replaces the + // "POSIXLY_CORRECT" environment variable in the C version + try + { + if((bool) new AppSettingsReader().GetValue( + "Gnu.PosixlyCorrect", typeof(bool))) + { + this.cultureInfo = new CultureInfo("en-US"); + } + } + catch(Exception) + { + } + + // Validate hasArg + if ((hasArg != Argument.No) && (hasArg != Argument.Required) && + (hasArg != Argument.Optional)) + { + object[] msgArgs = new object[]{hasArg}; + throw new System.ArgumentException(string.Format( + this.resManager.GetString("getopt.invalidValue", + this.cultureInfo), msgArgs)); + } + + // Store off values + this.name = name; + this.hasArg = hasArg; + this.flag = flag; + this.val = val; + } + #endregion + + /// + /// Returns the name of this LongOpt as a string + /// + /// + /// The name of the long option + /// + public string Name + { + get { return this.name; } + } + + /// + /// Returns the value set for the hasArg field for this long + /// option. + /// + /// + /// The value of hasArg. + /// + public Argument HasArg + { + get { return this.hasArg; } + } + + /// + /// Returns the value of the flag field for this long option. + /// + /// + /// The value of flag. + /// + public StringBuilder Flag + { + get { return this.flag; } + } + + /// + /// Returns the value of the val field for this long option. + /// + /// + /// The value of val. + /// + public int Val + { + get { return this.val; } + } + } // Class LongOpt +} \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.cs.resx b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.cs.resx new file mode 100644 index 00000000..fd15ec82 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.cs.resx @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + {0}: volba ''{1}'' je nejednoznaèná + + + {0}: volba ''--{1}'' nepøipou¹tí argument + + + {0}: volba ''{1}{2}'' nepøipou¹tí argument + + + {0}: volba ''{1}'' vy¾aduje argument + + + {0}: nepøípustná volba ''--{1}'' + + + {0}: nepøípustná volba ''{1}{2}'' + + + {0}: nepøípustná volba -- {1} + + + {0}: neplatná volba -- {1} + + + {0}: volba vy¾aduje argument -- {1} + + + Neplatná hodnota {0} parameteru 'has_arg' + + \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.de.resx b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.de.resx new file mode 100644 index 00000000..df5fe386 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.de.resx @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + {0}: Option ''{1}'' ist zweideutig + + + {0}: Option ''--{1}'' erlaubt kein Argument + + + {0}: Option ''{1}{2}'' erlaubt kein Argument + + + {0}: Option ''{1}'' benötigt ein Argument + + + {0}: Unbekannte Option ''--{1}'' + + + {0}: Unbekannte Option ''{1}{2}'' + + + {0}: Verbotene Option -- {1} + + + {0}: Ungültige Option -- {1} + + + {0}: Option benötigt ein Argument -- {1} + + + Ungültiger Wert {0} für Parameter 'has_arg' + + \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.fr.resx b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.fr.resx new file mode 100644 index 00000000..4271026b --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.fr.resx @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + {0}: l'option ''{1}'' est ambiguë + + + {0}: l'option ''--{1}'' ne permet pas de paramètre + + + {0}: l'option ''{1}{2}'' ne permet pas de paramètre + + + {0}: l'option ''{1}'' requiert un paramètre + + + {0}: option non reconnue ''--{1}'' + + + {0}: option non reconnue ''{1}{2}'' + + + {0}: option illégale -- {1} + + + {0}: option invalide -- {1} + + + {0}: cette option requiert un paramètre -- {1} + + + Valeur invalide {0} pour le paramètre 'has_arg' + + \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.hu.resx b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.hu.resx new file mode 100644 index 00000000..d813d976 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.hu.resx @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + {0}: opció ''{1}'' félreérthetõ + + + {0}: opció ''--{1}'' nem enged meg argumentumot + + + {0}: opció ''{1}{2}'' nem enged meg argumentumot + + + {0}: opció ''{1}'' argumentumot igényel + + + {0}: ismeretlen opció ''--{1}'' + + + {0}: ismeretlen opció ''{1}{2}'' + + + {0}: illegális opció -- {1} + + + {0}: érvénytelen opció -- {1} + + + {0}: az opció argumentumot igényel -- {1} + + + Érvénytelen érték {0} a következõ paraméterhez 'has_arg' + + \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.ja.resx b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.ja.resx new file mode 100644 index 00000000..85032b7a --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.ja.resx @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + {0}: ''{1}'' \u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u66d6\u6627\u3067\u3059\u3002 + + + {0}: ''--{1}'' \u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u3082\u3061\u307e\u305b\u3093\u3002 + + + {0}: ''{1}{2}'' \u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u3082\u3061\u307e\u305b\u3093\u3002 + + + {0}: ''{1}'' \u30aa\u30d7\u30b7\u30e7\u30f3\u306b\u306f\u30d1\u30e9\u30e1\u30fc\u30bf\u304c\u5fc5\u8981\u3067\u3059\u3002 + + + {0}: ''--{1}'' \u306f\u7121\u52b9\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u3059\u3002 + + + {0}: ''{1}{2}'' \u306f\u7121\u52b9\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u3059\u3002 + + + {0}: -- {1} \u306f\u4e0d\u6b63\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u3059\u3002 + + + {0}: -- {1} \u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093\u3002 + + + {0}: -- {1} \u30aa\u30d7\u30b7\u30e7\u30f3\u306b\u306f\u30d1\u30e9\u30e1\u30fc\u30bf\u304c\u5fc5\u8981\u3067\u3059\u3002 + + + {0} \u306f\u3001'has_arg' \u30d1\u30e9\u30e1\u30fc\u30bf\u3068\u3057\u3066\u4e0d\u6b63\u306a\u5024\u3067\u3059\u3002 + + \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.nl.resx b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.nl.resx new file mode 100644 index 00000000..e22fdc41 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.nl.resx @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + {0}: optie ''{1}'' is ambigue + + + {0}: optie ''--{1}'' staat geen argumenten toe + + + {0}: optie ''{1}{2}'' staat geen argumenten toe + + + {0}: optie ''{1}'' heeft een argument nodig + + + {0}: onbekende optie ''--{1}'' + + + {0}: onbekende optie ''{1}{2}'' + + + {0}: niet-toegestane optie -- {1} + + + {0}: onjuiste optie -- {1} + + + {0}: optie heeft een argument nodig -- {1} + + + Ongeldige waarde {0} voor parameter 'has_arg' + + \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.no.resx b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.no.resx new file mode 100644 index 00000000..822479d1 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.no.resx @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + {0}: flagget ''{1}'' er flertydig + + + {0}: flagget ''--{1}'' tillater ikke et argument + + + {0}: flagget ''{1}{2}'' tillater ikke et argument + + + {0}: flagget ''{1}'' krever et argument + + + {0}: ukjent flagg ''--{1}'' + + + {0}: ukjent flagg ''{1}{2}'' + + + {0}: ugyldig flagg -- {1} + + + {0}: ugyldig flagg -- {1} + + + {0}: flagget krever et argument -- {1} + + + Ugyldig verdi {0} for parameter 'has_arg' + + \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.resx b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.resx new file mode 100644 index 00000000..d4ec148a --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Getopt/MessagesBundle.resx @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + {0}: option ''{1}'' is ambiguous + + + {0}: option ''--{1}'' doesn't allow an argument + + + {0}: option ''{1}{2}'' doesn't allow an argument + + + {0}: option ''{1}'' requires an argument + + + {0}: unrecognized option ''--{1}'' + + + {0}: unrecognized option ''{1}{2}'' + + + {0}: invalid option -- {1} + + + {0}: illegal option -- {1} + + + {0}: option requires an argument -- {1} + + + Invalid value {0} for parameter 'has_arg' + + \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/Gnu.Gettext.csproj b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/Gnu.Gettext.csproj new file mode 100644 index 00000000..e8e1779e --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/Gnu.Gettext.csproj @@ -0,0 +1,61 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {859A653A-7728-4F02-BAF2-A5CD8F991916} + Library + Properties + GNU.Gettext + GNU.Gettext + v3.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + + + + + \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/Properties/AssemblyInfo.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..23a9c5b7 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/Properties/AssemblyInfo.cs @@ -0,0 +1,58 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 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("Gettext")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Gettext")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("3be71b7d-867c-46de-bb4d-d12215f0ae67")] + +// 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 Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/intl.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/intl.cs new file mode 100644 index 00000000..e3408993 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/intl.cs @@ -0,0 +1,520 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +/* GNU gettext for C# + * Copyright (C) 2003 Free Software Foundation, Inc. + * Written by Bruno Haible , 2003. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + */ + +/* + * Using the GNU gettext approach, compiled message catalogs are assemblies + * containing just one class, a subclass of GettextResourceSet. They are thus + * interoperable with standard ResourceManager based code. + * + * The main differences between the common .NET resources approach and the + * GNU gettext approach are: + * - In the .NET resource approach, the keys are abstract textual shortcuts. + * In the GNU gettext approach, the keys are the English/ASCII version + * of the messages. + * - In the .NET resource approach, the translation files are called + * "Resource.locale.resx" and are UTF-8 encoded XML files. In the GNU gettext + * approach, the translation files are called "Resource.locale.po" and are + * in the encoding the translator has chosen. There are at least three GUI + * translating tools (Emacs PO mode, KDE KBabel, GNOME gtranslator). + * - In the .NET resource approach, the function ResourceManager.GetString + * returns an empty string or throws an InvalidOperationException when no + * translation is found. In the GNU gettext approach, the GetString function + * returns the (English) message key in that case. + * - In the .NET resource approach, there is no support for plural handling. + * In the GNU gettext approach, we have the GetPluralString function. + * + * To compile GNU gettext message catalogs into C# assemblies, the msgfmt + * program can be used. + */ + +using System; /* String, InvalidOperationException, Console */ +using System.Globalization; /* CultureInfo */ +using System.Resources; /* ResourceManager, ResourceSet, IResourceReader */ +using System.Reflection; /* Assembly, ConstructorInfo */ +using System.Collections; /* Hashtable, ICollection, IEnumerator, IDictionaryEnumerator */ +using System.IO; /* Path, FileNotFoundException, Stream */ +using System.Text; /* StringBuilder */ + +namespace GNU.Gettext { + + /// + /// Each instance of this class can be used to lookup translations for a + /// given resource name. For each CultureInfo, it performs the lookup + /// in several assemblies, from most specific over territory-neutral to + /// language-neutral. + /// + public class GettextResourceManager : ResourceManager { + + // ======================== Public Constructors ======================== + + /// + /// Constructor. + /// + /// the resource name, also the assembly base + /// name + public GettextResourceManager (String baseName) + : base (baseName, Assembly.GetCallingAssembly(), typeof (GettextResourceSet)) { + } + + /// + /// Constructor. + /// + /// the resource name, also the assembly base + /// name + public GettextResourceManager (String baseName, Assembly assembly) + : base (baseName, assembly, typeof (GettextResourceSet)) { + } + + // ======================== Implementation ======================== + + /// + /// Loads and returns a satellite assembly. + /// + // This is like Assembly.GetSatelliteAssembly, but uses resourceName + // instead of assembly.GetName().Name, and works around a bug in + // mono-0.28. + private static Assembly GetSatelliteAssembly (Assembly assembly, String resourceName, CultureInfo culture) { + String satelliteExpectedLocation = + Path.GetDirectoryName(assembly.Location) + + Path.DirectorySeparatorChar + culture.Name + + Path.DirectorySeparatorChar + resourceName + ".resources.dll"; + return Assembly.LoadFrom(satelliteExpectedLocation); + } + + /// + /// Loads and returns the satellite assembly for a given culture. + /// + private Assembly MySatelliteAssembly (CultureInfo culture) { + return GetSatelliteAssembly(MainAssembly, BaseName, culture); + } + + /// + /// Converts a resource name to a class name. + /// + /// a nonempty string consisting of alphanumerics and underscores + /// and starting with a letter or underscore + private static String ConstructClassName (String resourceName) { + // We could just return an arbitrary fixed class name, like "Messages", + // assuming that every assembly will only ever contain one + // GettextResourceSet subclass, but this assumption would break the day + // we want to support multi-domain PO files in the same format... + bool valid = (resourceName.Length > 0); + for (int i = 0; valid && i < resourceName.Length; i++) { + char c = resourceName[i]; + if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c == '_') + || (i > 0 && c >= '0' && c <= '9'))) + valid = false; + } + if (valid) + return resourceName; + else { + // Use hexadecimal escapes, using the underscore as escape character. + String hexdigit = "0123456789abcdef"; + StringBuilder b = new StringBuilder(); + b.Append("__UESCAPED__"); + for (int i = 0; i < resourceName.Length; i++) { + char c = resourceName[i]; + if (c >= 0xd800 && c < 0xdc00 + && i+1 < resourceName.Length + && resourceName[i+1] >= 0xdc00 && resourceName[i+1] < 0xe000) { + // Combine two UTF-16 words to a character. + char c2 = resourceName[i+1]; + int uc = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); + b.Append('_'); + b.Append('U'); + b.Append(hexdigit[(uc >> 28) & 0x0f]); + b.Append(hexdigit[(uc >> 24) & 0x0f]); + b.Append(hexdigit[(uc >> 20) & 0x0f]); + b.Append(hexdigit[(uc >> 16) & 0x0f]); + b.Append(hexdigit[(uc >> 12) & 0x0f]); + b.Append(hexdigit[(uc >> 8) & 0x0f]); + b.Append(hexdigit[(uc >> 4) & 0x0f]); + b.Append(hexdigit[uc & 0x0f]); + i++; + } else if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') + || (c >= '0' && c <= '9'))) { + int uc = c; + b.Append('_'); + b.Append('u'); + b.Append(hexdigit[(uc >> 12) & 0x0f]); + b.Append(hexdigit[(uc >> 8) & 0x0f]); + b.Append(hexdigit[(uc >> 4) & 0x0f]); + b.Append(hexdigit[uc & 0x0f]); + } else + b.Append(c); + } + return b.ToString(); + } + } + + /// + /// Instantiates a resource set for a given culture. + /// + /// + /// The expected type name is not valid. + /// + /// + /// satelliteAssembly does not contain the expected type. + /// + /// + /// The type has no no-arguments constructor. + /// + private static GettextResourceSet InstantiateResourceSet (Assembly satelliteAssembly, String resourceName, CultureInfo culture) { + // We expect a class with a culture dependent class name. + Type clazz = satelliteAssembly.GetType(ConstructClassName(resourceName)+"_"+culture.Name.Replace('-','_')); + // We expect it has a no-argument constructor, and invoke it. + ConstructorInfo constructor = clazz.GetConstructor(Type.EmptyTypes); + return constructor.Invoke(null) as GettextResourceSet; + } + + private static GettextResourceSet[] EmptyResourceSetArray = new GettextResourceSet[0]; + + // Cache for already loaded GettextResourceSet cascades. + private Hashtable /* CultureInfo -> GettextResourceSet[] */ Loaded = new Hashtable(); + + /// + /// Returns the array of GettextResourceSets for a given culture, + /// loading them if necessary, and maintaining the cache. + /// + private GettextResourceSet[] GetResourceSetsFor (CultureInfo culture) { + //Console.WriteLine(">> GetResourceSetsFor "+culture); + // Look up in the cache. + GettextResourceSet[] result = Loaded[culture] as GettextResourceSet[]; + if (result == null) { + lock(this) { + // Look up again - maybe another thread has filled in the entry + // while we slept waiting for the lock. + result = Loaded[culture] as GettextResourceSet[]; + if (result == null) { + // Determine the GettextResourceSets for the given culture. + if (culture.Parent == null || culture.Equals(CultureInfo.InvariantCulture)) + // Invariant culture. + result = EmptyResourceSetArray; + else { + // Use a satellite assembly as primary GettextResourceSet, and + // the result for the parent culture as fallback. + GettextResourceSet[] parentResult = GetResourceSetsFor(culture.Parent); + Assembly satelliteAssembly; + try { + satelliteAssembly = MySatelliteAssembly(culture); + } catch (FileNotFoundException e) { + satelliteAssembly = null; + } + if (satelliteAssembly != null) { + GettextResourceSet satelliteResourceSet; + try { + satelliteResourceSet = InstantiateResourceSet(satelliteAssembly, BaseName, culture); + } catch (Exception e) { + Console.Error.WriteLine(e); + Console.Error.WriteLine(e.StackTrace); + satelliteResourceSet = null; + } + if (satelliteResourceSet != null) { + result = new GettextResourceSet[1+parentResult.Length]; + result[0] = satelliteResourceSet; + Array.Copy(parentResult, 0, result, 1, parentResult.Length); + } else + result = parentResult; + } else + result = parentResult; + } + // Put the result into the cache. + Loaded.Add(culture, result); + } + } + } + //Console.WriteLine("<< GetResourceSetsFor "+culture); + return result; + } + + /* + /// + /// Releases all loaded GettextResourceSets and their assemblies. + /// + // TODO: No way to release an Assembly? + public override void ReleaseAllResources () { + ... + } + */ + + /// + /// Returns the translation of in a given culture. + /// + /// the key string to be translated, an ASCII + /// string + /// the translation of , or + /// if none is found + public override String GetString (String msgid, CultureInfo culture) { + foreach (GettextResourceSet rs in GetResourceSetsFor(culture)) { + String translation = rs.GetString(msgid); + if (translation != null) + return translation; + } + // Fallback. + return msgid; + } + + /// + /// Returns the translation of and + /// in a given culture, choosing the right + /// plural form depending on the number . + /// + /// the key string to be translated, an ASCII + /// string + /// the English plural of , + /// an ASCII string + /// the number, should be >= 0 + /// the translation, or or + /// if none is found + public virtual String GetPluralString (String msgid, String msgidPlural, long n, CultureInfo culture) { + foreach (GettextResourceSet rs in GetResourceSetsFor(culture)) { + String translation = rs.GetPluralString(msgid, msgidPlural, n); + if (translation != null) + return translation; + } + // Fallback: Germanic plural form. + return (n == 1 ? msgid : msgidPlural); + } + + // ======================== Public Methods ======================== + + /// + /// Returns the translation of in the current + /// culture. + /// + /// the key string to be translated, an ASCII + /// string + /// the translation of , or + /// if none is found + public override String GetString (String msgid) { + return GetString(msgid, CultureInfo.CurrentUICulture); + } + + /// + /// Returns the translation of and + /// in the current culture, choosing the + /// right plural form depending on the number . + /// + /// the key string to be translated, an ASCII + /// string + /// the English plural of , + /// an ASCII string + /// the number, should be >= 0 + /// the translation, or or + /// if none is found + public virtual String GetPluralString (String msgid, String msgidPlural, long n) { + return GetPluralString(msgid, msgidPlural, n, CultureInfo.CurrentUICulture); + } + + } + + /// + /// + /// Each instance of this class encapsulates a single PO file. + /// + /// + /// This API of this class is not meant to be used directly; use + /// GettextResourceManager instead. + /// + /// + // We need this subclass of ResourceSet, because the plural formula must come + // from the same ResourceSet as the object containing the plural forms. + public class GettextResourceSet : ResourceSet { + + /// + /// Creates a new message catalog. When using this constructor, you + /// must override the ReadResources method, in order to initialize + /// the Table property. The message catalog will support plural + /// forms only if the ReadResources method installs values of type + /// String[] and if the PluralEval method is overridden. + /// + protected GettextResourceSet () + : base (DummyResourceReader) { + } + + /// + /// Creates a new message catalog, by reading the string/value pairs from + /// the given . The message catalog will support + /// plural forms only if the reader can produce values of type + /// String[] and if the PluralEval method is overridden. + /// + public GettextResourceSet (IResourceReader reader) + : base (reader) { + } + + /// + /// Creates a new message catalog, by reading the string/value pairs from + /// the given , which should have the format of + /// a .resources file. The message catalog will not support plural + /// forms. + /// + public GettextResourceSet (Stream stream) + : base (stream) { + } + + /// + /// Creates a new message catalog, by reading the string/value pairs from + /// the file with the given . The file should + /// be in the format of a .resources file. The message catalog will + /// not support plural forms. + /// + public GettextResourceSet (String fileName) + : base (fileName) { + } + + /// + /// Returns the translation of . + /// + /// the key string to be translated, an ASCII + /// string + /// the translation of , or null if + /// none is found + // The default implementation essentially does (String)Table[msgid]. + // Here we also catch the plural form case. + public override String GetString (String msgid) { + Object value = GetObject(msgid); + if (value == null || value is String) + return (String)value; + else if (value is String[]) + // A plural form, but no number is given. + // Like the C implementation, return the first plural form. + return (value as String[])[0]; + else + throw new InvalidOperationException("resource for \""+msgid+"\" in "+GetType().FullName+" is not a string"); + } + + /// + /// Returns the translation of , with possibly + /// case-insensitive lookup. + /// + /// the key string to be translated, an ASCII + /// string + /// the translation of , or null if + /// none is found + // The default implementation essentially does (String)Table[msgid]. + // Here we also catch the plural form case. + public override String GetString (String msgid, bool ignoreCase) { + Object value = GetObject(msgid, ignoreCase); + if (value == null || value is String) + return (String)value; + else if (value is String[]) + // A plural form, but no number is given. + // Like the C implementation, return the first plural form. + return (value as String[])[0]; + else + throw new InvalidOperationException("resource for \""+msgid+"\" in "+GetType().FullName+" is not a string"); + } + + /// + /// Returns the translation of and + /// , choosing the right plural form + /// depending on the number . + /// + /// the key string to be translated, an ASCII + /// string + /// the English plural of , + /// an ASCII string + /// the number, should be >= 0 + /// the translation, or null if none is found + public virtual String GetPluralString (String msgid, String msgidPlural, long n) { + Object value = GetObject(msgid); + if (value == null || value is String) + return (String)value; + else if (value is String[]) { + String[] choices = value as String[]; + long index = PluralEval(n); + return choices[index >= 0 && index < choices.Length ? index : 0]; + } else + throw new InvalidOperationException("resource for \""+msgid+"\" in "+GetType().FullName+" is not a string"); + } + + /// + /// Returns the index of the plural form to be chosen for a given number. + /// The default implementation is the Germanic plural formula: + /// zero for == 1, one for != 1. + /// + protected virtual long PluralEval (long n) { + return (n == 1 ? 0 : 1); + } + + /// + /// Returns the keys of this resource set, i.e. the strings for which + /// GetObject() can return a non-null value. + /// + public virtual ICollection Keys { + get { + return Table.Keys; + } + } + + /// + /// A trivial instance of IResourceReader that does nothing. + /// + // Needed by the no-arguments constructor. + private static IResourceReader DummyResourceReader = new DummyIResourceReader(); + + } + + /// + /// A trivial IResourceReader implementation. + /// + class DummyIResourceReader : IResourceReader { + + // Implementation of IDisposable. + void System.IDisposable.Dispose () { + } + + // Implementation of IEnumerable. + IEnumerator System.Collections.IEnumerable.GetEnumerator () { + return null; + } + + // Implementation of IResourceReader. + void System.Resources.IResourceReader.Close () { + } + IDictionaryEnumerator System.Resources.IResourceReader.GetEnumerator () { + return null; + } + + } + +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/msgfmt.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/msgfmt.cs new file mode 100644 index 00000000..037ccd38 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/msgfmt.cs @@ -0,0 +1,142 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +/* GNU gettext for C# + * Copyright (C) 2003 Free Software Foundation, Inc. + * Written by Bruno Haible , 2003. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* + * This program creates a .resources file from a set of key/value pairs given + * on standard input. + */ + +using System; /* String, Console, Exception */ +using System.IO; /* Stream, BufferedStream, StreamReader */ +using System.Text; /* StringBuilder, UTF8Encoding */ +using System.Resources; /* ResourceWriter */ + +namespace GNU.Gettext { + public class WriteResource { + private StreamReader reader; + // Read a NUL-terminated UTF-8 encoded string. + private String ReadString () { + StringBuilder b = new StringBuilder(); + for (;;) { + int c = reader.Read(); + if (c < 0) // EOF? + return null; + if (c == 0) // End of String? + break; + b.Append((char)c); + } + return b.ToString(); + } + // Read all msgid/msgstr pairs, register them in the ResourceWriter, + // and write the binary contents to the output stream. + private void ReadAllInput (ResourceWriter rw) { + for (;;) { + String msgid = ReadString(); + if (msgid == null) + break; + String msgstr = ReadString(); + if (msgstr == null) + break; + rw.AddResource(msgid, msgstr); + } + rw.Generate(); + } + // Read all msgid/msgstr pairs (each string being NUL-terminated and + // UTF-8 encoded) and write the .resources file to the given filename. + WriteResource (String filename) { + Stream input = new BufferedStream(Console.OpenStandardInput()); + reader = new StreamReader(input, new UTF8Encoding()); + if (filename.Equals("-")) { + BufferedStream output = new BufferedStream(Console.OpenStandardOutput()); + // A temporary output stream is needed because ResourceWriter.Generate + // expects to be able to seek in the Stream. + MemoryStream tmpoutput = new MemoryStream(); + ResourceWriter rw = new ResourceWriter(tmpoutput); + ReadAllInput(rw); +#if __CSCC__ + // Use the ResourceReader to check against pnet-0.6.0 ResourceWriter + // bug. + try { + ResourceReader rr = new ResourceReader(new MemoryStream(tmpoutput.ToArray())); + foreach (System.Collections.DictionaryEntry entry in rr); + } catch (IOException e) { + throw new Exception("class ResourceWriter is buggy", e); + } +#endif + tmpoutput.WriteTo(output); + rw.Close(); + output.Close(); + } else { +#if __CSCC__ + MemoryStream tmpoutput = new MemoryStream(); + ResourceWriter rw = new ResourceWriter(tmpoutput); + ReadAllInput(rw); + // Use the ResourceReader to check against pnet-0.6.0 ResourceWriter + // bug. + try { + ResourceReader rr = new ResourceReader(new MemoryStream(tmpoutput.ToArray())); + foreach (System.Collections.DictionaryEntry entry in rr); + } catch (IOException e) { + throw new Exception("class ResourceWriter is buggy", e); + } + BufferedStream output = new BufferedStream(new FileStream(filename, FileMode.Create, FileAccess.Write)); + tmpoutput.WriteTo(output); + rw.Close(); + output.Close(); +#else + ResourceWriter rw = new ResourceWriter(filename); + ReadAllInput(rw); + rw.Close(); +#endif + } + } + public static int Main (String[] args) { + try { + new WriteResource(args[0]); + } catch (Exception e) { + Console.Error.WriteLine(e); + Console.Error.WriteLine(e.StackTrace); + return 1; + } + return 0; + } + } +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/msgunfmt.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/msgunfmt.cs new file mode 100644 index 00000000..d4985881 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Lib/Gnu.Gettext/msgunfmt.cs @@ -0,0 +1,258 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +/* GNU gettext for C# + * Copyright (C) 2003-2004 Free Software Foundation, Inc. + * Written by Bruno Haible , 2003. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* + * This program dumps a GettextResourceSet subclass (in a satellite assembly) + * or a .resources file as a PO file. + */ + +using System; /* Object, String, Type, Console, Exception */ +using System.Reflection; /* Assembly, MethodInfo, ConstructorInfo */ +using System.Collections; /* Hashtable, DictionaryEntry */ +using System.IO; /* BufferedStream, StreamWriter, TextWriter, FileNotFoundException, Path */ +using System.Text; /* StringBuilder, UTF8Encoding */ +using System.Resources; /* ResourceReader */ +using GNU.Gettext; /* GettextResourceSet */ + +namespace GNU.Gettext { + public class DumpResource { + private TextWriter Out; + private void DumpString (String str) { + int n = str.Length; + Out.Write('"'); + for (int i = 0; i < n; i++) { + char c = str[i]; + if (c == 0x0008) { + Out.Write('\\'); Out.Write('b'); + } else if (c == 0x000c) { + Out.Write('\\'); Out.Write('f'); + } else if (c == 0x000a) { + Out.Write('\\'); Out.Write('n'); + } else if (c == 0x000d) { + Out.Write('\\'); Out.Write('r'); + } else if (c == 0x0009) { + Out.Write('\\'); Out.Write('t'); + } else if (c == '\\' || c == '"') { + Out.Write('\\'); Out.Write(c); + } else + Out.Write(c); + } + Out.Write('"'); + } + private void DumpMessage (String msgid, String msgid_plural, Object msgstr) { + Out.Write("msgid "); DumpString(msgid); Out.Write('\n'); + if (msgid_plural != null) { + Out.Write("msgid_plural "); DumpString(msgid_plural); Out.Write('\n'); + for (int i = 0; i < (msgstr as String[]).Length; i++) { + Out.Write("msgstr[" + i + "] "); + DumpString((msgstr as String[])[i]); + Out.Write('\n'); + } + } else { + Out.Write("msgstr "); DumpString(msgstr as String); Out.Write('\n'); + } + Out.Write('\n'); + } + + // ---------------- Dumping a GettextResourceSet ---------------- + + private void Dump (GettextResourceSet catalog) { + MethodInfo pluralMethod = + catalog.GetType().GetMethod("GetMsgidPluralTable", Type.EmptyTypes); + // Search for the header entry. + { + Object header_entry = catalog.GetObject(""); + // If there is no header entry, fake one. + // FIXME: This is not needed; right after po_lex_charset_init set + // the PO charset to UTF-8. + if (header_entry == null) + header_entry = "Content-Type: text/plain; charset=UTF-8\n"; + DumpMessage("", null, header_entry); + } + // Now the other messages. + { + Hashtable plural = null; + if (pluralMethod != null) + plural = pluralMethod.Invoke(catalog, new Object[0]) as Hashtable; + foreach (String key in catalog.Keys) + if (!"".Equals(key)) { + Object value = catalog.GetObject(key); + String key_plural = + (plural != null && value is String[] ? plural[key] as String : null); + DumpMessage(key, key_plural, value); + } + } + } + // Essentially taken from class GettextResourceManager. + private static Assembly GetSatelliteAssembly (String baseDirectory, String resourceName, String cultureName) { + String satelliteExpectedLocation = + baseDirectory + + Path.DirectorySeparatorChar + cultureName + + Path.DirectorySeparatorChar + resourceName + ".resources.dll"; + return Assembly.LoadFrom(satelliteExpectedLocation); + } + // Taken from class GettextResourceManager. + private static String ConstructClassName (String resourceName) { + // We could just return an arbitrary fixed class name, like "Messages", + // assuming that every assembly will only ever contain one + // GettextResourceSet subclass, but this assumption would break the day + // we want to support multi-domain PO files in the same format... + bool valid = (resourceName.Length > 0); + for (int i = 0; valid && i < resourceName.Length; i++) { + char c = resourceName[i]; + if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c == '_') + || (i > 0 && c >= '0' && c <= '9'))) + valid = false; + } + if (valid) + return resourceName; + else { + // Use hexadecimal escapes, using the underscore as escape character. + String hexdigit = "0123456789abcdef"; + StringBuilder b = new StringBuilder(); + b.Append("__UESCAPED__"); + for (int i = 0; i < resourceName.Length; i++) { + char c = resourceName[i]; + if (c >= 0xd800 && c < 0xdc00 + && i+1 < resourceName.Length + && resourceName[i+1] >= 0xdc00 && resourceName[i+1] < 0xe000) { + // Combine two UTF-16 words to a character. + char c2 = resourceName[i+1]; + int uc = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); + b.Append('_'); + b.Append('U'); + b.Append(hexdigit[(uc >> 28) & 0x0f]); + b.Append(hexdigit[(uc >> 24) & 0x0f]); + b.Append(hexdigit[(uc >> 20) & 0x0f]); + b.Append(hexdigit[(uc >> 16) & 0x0f]); + b.Append(hexdigit[(uc >> 12) & 0x0f]); + b.Append(hexdigit[(uc >> 8) & 0x0f]); + b.Append(hexdigit[(uc >> 4) & 0x0f]); + b.Append(hexdigit[uc & 0x0f]); + i++; + } else if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') + || (c >= '0' && c <= '9'))) { + int uc = c; + b.Append('_'); + b.Append('u'); + b.Append(hexdigit[(uc >> 12) & 0x0f]); + b.Append(hexdigit[(uc >> 8) & 0x0f]); + b.Append(hexdigit[(uc >> 4) & 0x0f]); + b.Append(hexdigit[uc & 0x0f]); + } else + b.Append(c); + } + return b.ToString(); + } + } + // Essentially taken from class GettextResourceManager. + private static GettextResourceSet InstantiateResourceSet (Assembly satelliteAssembly, String resourceName, String cultureName) { + Type clazz = satelliteAssembly.GetType(ConstructClassName(resourceName)+"_"+cultureName.Replace('-','_')); + ConstructorInfo constructor = clazz.GetConstructor(Type.EmptyTypes); + return constructor.Invoke(null) as GettextResourceSet; + } + public DumpResource (String baseDirectory, String resourceName, String cultureName) { + // We are only interested in the messages belonging to the locale + // itself, not in the inherited messages. Therefore we instantiate just + // the GettextResourceSet, not a GettextResourceManager. + Assembly satelliteAssembly = + GetSatelliteAssembly(baseDirectory, resourceName, cultureName); + GettextResourceSet catalog = + InstantiateResourceSet(satelliteAssembly, resourceName, cultureName); + BufferedStream stream = new BufferedStream(Console.OpenStandardOutput()); + Out = new StreamWriter(stream, new UTF8Encoding()); + Dump(catalog); + Out.Close(); + stream.Close(); + } + + // ----------------- Dumping a .resources file ------------------ + + public DumpResource (String filename) { + BufferedStream stream = new BufferedStream(Console.OpenStandardOutput()); + Out = new StreamWriter(stream, new UTF8Encoding()); + ResourceReader rr; + if (filename.Equals("-")) { + BufferedStream input = new BufferedStream(Console.OpenStandardInput()); + // A temporary output stream is needed because ResourceReader expects + // to be able to seek in the Stream. + byte[] contents; + { + MemoryStream tmpstream = new MemoryStream(); + byte[] buf = new byte[1024]; + for (;;) { + int n = input.Read(buf, 0, 1024); + if (n == 0) + break; + tmpstream.Write(buf, 0, n); + } + contents = tmpstream.ToArray(); + tmpstream.Close(); + } + MemoryStream tmpinput = new MemoryStream(contents); + rr = new ResourceReader(tmpinput); + } else { + rr = new ResourceReader(filename); + } + foreach (DictionaryEntry entry in rr) // uses rr.GetEnumerator() + DumpMessage(entry.Key as String, null, entry.Value as String); + rr.Close(); + Out.Close(); + stream.Close(); + } + + // -------------------------------------------------------------- + + public static int Main (String[] args) { + try { + if (args.Length > 1) + new DumpResource(args[0], args[1], args[2]); + else + new DumpResource(args[0]); + } catch (Exception e) { + Console.Error.WriteLine(e); + Console.Error.WriteLine(e.StackTrace); + return 1; + } + return 0; + } + } +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Gettext.Samples.Console.csproj b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Gettext.Samples.Console.csproj new file mode 100644 index 00000000..79e7a4fe --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Gettext.Samples.Console.csproj @@ -0,0 +1,92 @@ + + + + Debug + AnyCPU + 9.0.21022 + 2.0 + {470FDBA5-04E5-4A9F-80EA-987D1F8D9074} + Exe + Properties + Gettext.Samples.Console + Gettext.Samples.Console + v3.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + True + True + Strings.tt + + + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + TextTemplatingFileGenerator + Strings.cs + + + + + {D8869765-AB47-4C03-B2C5-E5498A55CA79} + Gettext.Cs + + + + + \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Program.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Program.cs new file mode 100644 index 00000000..92fbf725 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Program.cs @@ -0,0 +1,76 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Globalization; + +namespace Gettext.Samples.Console +{ + class Program + { + static void Main(string[] args) + { + if (SetCultureFromArgs(args)) + { + string translated = Strings.T("Hello world"); + System.Console.Out.WriteLine(translated); + } + } + + private static bool SetCultureFromArgs(string[] args) + { + if (args.Length == 0 || args[0].Contains("?")) + { + PrintUsage(); + return false; + } + else + { + try + { + var culture = CultureInfo.GetCultureInfo(args[0]); + System.Threading.Thread.CurrentThread.CurrentUICulture = culture; + return true; + } + catch (Exception ex) + { + System.Console.Error.WriteLine("Error setting culture from argument {0}:\n{1}", args[0], ex.Message); + return false; + } + } + } + + private static void PrintUsage() + { + System.Console.Out.WriteLine("Use culture short code as only parameter to view message in that language. Choose from one of the available cultures; localized cultures will fall back to neutral ones, and not available ones will fall back to english."); + System.Console.Out.WriteLine(); + System.Console.Out.WriteLine("Available cultures:"); + System.Console.Out.WriteLine(" en"); + System.Console.Out.WriteLine(" es"); + System.Console.Out.WriteLine(" pt"); + System.Console.Out.WriteLine(" fr"); + } + } +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Properties/AssemblyInfo.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..a1fdc131 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Properties/AssemblyInfo.cs @@ -0,0 +1,58 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 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("Gettext.Samples.Console")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Gettext.Samples.Console")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b773169f-8efd-4d1c-b873-625eb1f90c26")] + +// 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 Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Resources/en/Strings.po b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Resources/en/Strings.po new file mode 100644 index 00000000..dec6eeac --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Resources/en/Strings.po @@ -0,0 +1,3 @@ +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Console\Program.cs:15 +msgid "Hello world" +msgstr "" diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Resources/es/Strings.po b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Resources/es/Strings.po new file mode 100644 index 00000000..8e7edd51 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Resources/es/Strings.po @@ -0,0 +1,3 @@ +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Console\Program.cs:15 +msgid "Hello world" +msgstr "Hola mundo" diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Resources/fr/Strings.po b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Resources/fr/Strings.po new file mode 100644 index 00000000..ffdf43ca --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Resources/fr/Strings.po @@ -0,0 +1,3 @@ +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Console\Program.cs:15 +msgid "Hello world" +msgstr "Bonjour tout le monde" diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Resources/pt/Strings.po b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Resources/pt/Strings.po new file mode 100644 index 00000000..0e647052 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Resources/pt/Strings.po @@ -0,0 +1,3 @@ +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Console\Program.cs:15 +msgid "Hello world" +msgstr "Olá mundo" diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Strings.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Strings.cs new file mode 100644 index 00000000..63569620 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Strings.cs @@ -0,0 +1,168 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + + +// +// This code was generated by a tool. Any changes made manually will be lost +// the next time this code is regenerated. +// + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Globalization; +using System.Threading; +using System.Configuration; +using System.Diagnostics; +using System.IO; +using System.Reflection; + +namespace Gettext.Samples.Console +{ + public class Strings + { + private static Object resourceManLock = new Object(); + private static System.Resources.ResourceManager resourceMan; + private static System.Globalization.CultureInfo resourceCulture; + + public const string ResourceName = "Strings"; + + private static string resourcesDir = GetSetting("ResourcesDir", "Resources"); + private static string fileFormat = GetSetting("ResourcesFileFormat", "{{culture}}/{{resource}}.po"); + + private static string GetSetting(string setting, string defaultValue) + { + var section = (System.Collections.Specialized.NameValueCollection)System.Configuration.ConfigurationManager.GetSection("appSettings"); + if (section == null) return defaultValue; + else return section[setting] ?? defaultValue; + } + + + /// + /// Resources directory used to retrieve files from. + /// + public static string ResourcesDirectory + { + get { return resourcesDir; } + set { resourcesDir = value; } + } + + /// + /// Format of the file based on culture and resource name. + /// + public static string FileFormat + { + get { return fileFormat; } + set { fileFormat = value; } + } + + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + public static System.Resources.ResourceManager ResourceManager + { + get + { + + if (object.ReferenceEquals(resourceMan, null)) + { + lock (resourceManLock) + { + if (object.ReferenceEquals(resourceMan, null)) + { + var directory = resourcesDir; + var mgr = new global::Gettext.Cs.GettextResourceManager(ResourceName, directory, fileFormat); + resourceMan = mgr; + } + } + } + + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + public static System.Globalization.CultureInfo Culture + { + get { return resourceCulture; } + set { resourceCulture = value; } + } + + /// + /// Looks up a localized string; used to mark string for translation as well. + /// + public static string T(string t) + { + return T(null, t); + } + + /// + /// Looks up a localized string; used to mark string for translation as well. + /// + public static string T(CultureInfo info, string t) + { + if (String.IsNullOrEmpty(t)) return t; + var translated = ResourceManager.GetString(t, info ?? resourceCulture); + return String.IsNullOrEmpty(translated) ? t : translated; + } + + /// + /// Looks up a localized string and formats it with the parameters provided; used to mark string for translation as well. + /// + public static string T(string t, params object[] parameters) + { + return T(null, t, parameters); + } + + /// + /// Looks up a localized string and formats it with the parameters provided; used to mark string for translation as well. + /// + public static string T(CultureInfo info, string t, params object[] parameters) + { + if (String.IsNullOrEmpty(t)) return t; + return String.Format(T(info, t), parameters); + } + + /// + /// Marks a string for future translation, does not translate it now. + /// + public static string M(string t) + { + return t; + } + + /// + /// Returns the resource set available for the specified culture. + /// + public static System.Resources.ResourceSet GetResourceSet(CultureInfo culture) + { + return ResourceManager.GetResourceSet(culture, true, true); + } + } +} + + diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Strings.tt b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Strings.tt new file mode 100644 index 00000000..fb3c2dc6 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Strings.tt @@ -0,0 +1,9 @@ +<#@ assembly name="System.Configuration" #> + +<# + this.ClassName = "Strings"; + this.ResourceName = "Strings"; + this.NamespaceName = "Gettext.Samples.Console"; + this.DefaultResourceDir = "Resources"; +#> +<#@ include file="..\..\Core\Gettext.Cs\Templates\Strings.tt" #> diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Templates/Strings.pot b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Templates/Strings.pot new file mode 100644 index 00000000..dec6eeac --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/Templates/Strings.pot @@ -0,0 +1,3 @@ +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Console\Program.cs:15 +msgid "Hello world" +msgstr "" diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/scripts/Extract.bat b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/scripts/Extract.bat new file mode 100644 index 00000000..732363d0 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Console/scripts/Extract.bat @@ -0,0 +1,30 @@ +rem gettext-cs-utils +rem +rem Copyright 2011 Manas Technology Solutions +rem http://www.manas.com.ar/ +rem +rem This library is free software; you can redistribute it and/or +rem modify it under the terms of the GNU Lesser General Public +rem License as published by the Free Software Foundation; either +rem version 2.1 of the License, or (at your option) any later version. +rem +rem This library is distributed in the hope that it will be useful, +rem but WITHOUT ANY WARRANTY; without even the implied warranty of +rem MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +rem Lesser General Public License for more details. +rem +rem You should have received a copy of the GNU Lesser General Public +rem License along with this library. If not, see . + + +@ECHO OFF + +echo. +echo Setting up global variables... +SET path_xgettext=..\..\..\Bin\Gnu.Gettext.Win32\xgettext.exe +SET path_output=..\Templates +SET file_list=.\..\*.cs + +echo. +echo Generating strings po file... +CALL ..\..\..\Scripts\ExtractStrings.bat Strings \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/App.config b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/App.config new file mode 100644 index 00000000..ebb2dc86 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/App.config @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Gettext.Samples.Database.csproj b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Gettext.Samples.Database.csproj new file mode 100644 index 00000000..37fb0dca --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Gettext.Samples.Database.csproj @@ -0,0 +1,81 @@ + + + + Debug + AnyCPU + 9.0.21022 + 2.0 + {9FBD5BA7-BCE6-48FE-9FB7-396F377D1313} + Exe + Properties + Gettext.Samples.Database + Gettext.Samples.Database + v3.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + Strings.tt + True + True + + + + + {D8869765-AB47-4C03-B2C5-E5498A55CA79} + Gettext.Cs + + + + + + TextTemplatingFileGenerator + Strings.cs + + + + + + + + \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Program.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Program.cs new file mode 100644 index 00000000..27b69fc6 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Program.cs @@ -0,0 +1,77 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Globalization; + +namespace Gettext.Samples.Database +{ + class Program + { + static void Main(string[] args) + { + if (SetCultureFromArgs(args)) + { + string translated = Strings.T("Hello world"); + System.Console.Out.WriteLine(translated); + } + } + + private static bool SetCultureFromArgs(string[] args) + { + if (args.Length == 0 || args[0].Contains("?")) + { + PrintUsage(); + return false; + } + else + { + try + { + var culture = CultureInfo.GetCultureInfo(args[0]); + System.Threading.Thread.CurrentThread.CurrentUICulture = culture; + return true; + } + catch (Exception ex) + { + System.Console.Error.WriteLine("Error setting culture from argument {0}:\n{1}", args[0], ex.Message); + return false; + } + } + } + + private static void PrintUsage() + { + System.Console.Out.WriteLine("Use culture short code as only parameter to view message in that language. Choose from one of the available cultures; localized cultures will fall back to neutral ones, and not available ones will fall back to english."); + System.Console.Out.WriteLine(); + System.Console.Out.WriteLine("Available cultures:"); + System.Console.Out.WriteLine(" en"); + System.Console.Out.WriteLine(" es"); + System.Console.Out.WriteLine(" pt"); + System.Console.Out.WriteLine(" fr"); + } + + } +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Properties/AssemblyInfo.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..df55236f --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Properties/AssemblyInfo.cs @@ -0,0 +1,58 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 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("Gettext.Samples.Database")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Gettext.Samples.Database")] +[assembly: AssemblyCopyright("Copyright © 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("4aee2ac6-27d5-4d59-a695-53778e5d56c0")] + +// 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 Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Strings.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Strings.cs new file mode 100644 index 00000000..80a35301 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Strings.cs @@ -0,0 +1,147 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + + +// +// This code was generated by a tool. Any changes made manually will be lost +// the next time this code is regenerated. +// + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Globalization; +using System.Threading; +using System.Configuration; +using System.Diagnostics; +using System.IO; +using System.Reflection; + +namespace Gettext.Samples.Database +{ + public class Strings + { + private static Object resourceManLock = new Object(); + private static System.Resources.ResourceManager resourceMan; + private static System.Globalization.CultureInfo resourceCulture; + + public const string ResourceName = "Strings"; + + + private static string GetSetting(string setting, string defaultValue) + { + var section = (System.Collections.Specialized.NameValueCollection)System.Configuration.ConfigurationManager.GetSection("appSettings"); + if (section == null) return defaultValue; + else return section[setting] ?? defaultValue; + } + + + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + public static System.Resources.ResourceManager ResourceManager + { + get + { + + if (object.ReferenceEquals(resourceMan, null)) + { + lock (resourceManLock) + { + if (object.ReferenceEquals(resourceMan, null)) + { + var mgr = new global::Gettext.Cs.DatabaseResourceManager("GettextGetResourceSet"); + resourceMan = mgr; + } + } + } + + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + public static System.Globalization.CultureInfo Culture + { + get { return resourceCulture; } + set { resourceCulture = value; } + } + + /// + /// Looks up a localized string; used to mark string for translation as well. + /// + public static string T(string t) + { + return T(null, t); + } + + /// + /// Looks up a localized string; used to mark string for translation as well. + /// + public static string T(CultureInfo info, string t) + { + if (String.IsNullOrEmpty(t)) return t; + var translated = ResourceManager.GetString(t, info ?? resourceCulture); + return String.IsNullOrEmpty(translated) ? t : translated; + } + + /// + /// Looks up a localized string and formats it with the parameters provided; used to mark string for translation as well. + /// + public static string T(string t, params object[] parameters) + { + return T(null, t, parameters); + } + + /// + /// Looks up a localized string and formats it with the parameters provided; used to mark string for translation as well. + /// + public static string T(CultureInfo info, string t, params object[] parameters) + { + if (String.IsNullOrEmpty(t)) return t; + return String.Format(T(info, t), parameters); + } + + /// + /// Marks a string for future translation, does not translate it now. + /// + public static string M(string t) + { + return t; + } + + /// + /// Returns the resource set available for the specified culture. + /// + public static System.Resources.ResourceSet GetResourceSet(CultureInfo culture) + { + return ResourceManager.GetResourceSet(culture, true, true); + } + } +} + + diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Strings.tt b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Strings.tt new file mode 100644 index 00000000..cff4cd06 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Strings.tt @@ -0,0 +1,10 @@ +<#@ assembly name="System.Configuration" #> + +<# + this.ClassName = "Strings"; + this.ResourceName = "Strings"; + this.NamespaceName = "Gettext.Samples.Database"; + this.StoredProcedureName = "GettextGetResourceSet"; + this.UseDatabase = true; +#> +<#@ include file="..\..\Core\Gettext.Cs\Templates\Strings.tt" #> diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Translated/en/Strings.po b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Translated/en/Strings.po new file mode 100644 index 00000000..dec6eeac --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Translated/en/Strings.po @@ -0,0 +1,3 @@ +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Console\Program.cs:15 +msgid "Hello world" +msgstr "" diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Translated/es/Strings.po b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Translated/es/Strings.po new file mode 100644 index 00000000..8e7edd51 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Translated/es/Strings.po @@ -0,0 +1,3 @@ +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Console\Program.cs:15 +msgid "Hello world" +msgstr "Hola mundo" diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Translated/fr/Strings.po b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Translated/fr/Strings.po new file mode 100644 index 00000000..ffdf43ca --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Translated/fr/Strings.po @@ -0,0 +1,3 @@ +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Console\Program.cs:15 +msgid "Hello world" +msgstr "Bonjour tout le monde" diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Translated/pt/Strings.po b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Translated/pt/Strings.po new file mode 100644 index 00000000..0e647052 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/Translated/pt/Strings.po @@ -0,0 +1,3 @@ +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Console\Program.cs:15 +msgid "Hello world" +msgstr "Olá mundo" diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/scripts/DBDump.bat b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/scripts/DBDump.bat new file mode 100644 index 00000000..7cfc8f20 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Database/scripts/DBDump.bat @@ -0,0 +1,39 @@ +rem gettext-cs-utils +rem +rem Copyright 2011 Manas Technology Solutions +rem http://www.manas.com.ar/ +rem +rem This library is free software; you can redistribute it and/or +rem modify it under the terms of the GNU Lesser General Public +rem License as published by the Free Software Foundation; either +rem version 2.1 of the License, or (at your option) any later version. +rem +rem This library is distributed in the hope that it will be useful, +rem but WITHOUT ANY WARRANTY; without even the implied warranty of +rem MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +rem Lesser General Public License for more details. +rem +rem You should have received a copy of the GNU Lesser General Public +rem License along with this library. If not, see . + + +@ECHO OFF + +SET dbrsgen=..\..\..\Tools\Gettext.DatabaseResourceGenerator\bin\Debug\DatabaseResourceGenerator.exe + +echo. +echo Dumping culture sets into DB... + +echo Culture es +CALL %dbrsgen% -i ..\Translated\es\Strings.po -c es -a + +echo Culture en +CALL %dbrsgen% -i ..\Translated\en\Strings.po -c en -a + +echo Culture pt +CALL %dbrsgen% -i ..\Translated\pt\Strings.po -c pt -a + +echo Culture fr +CALL %dbrsgen% -i ..\Translated\fr\Strings.po -c fr -a + +pause \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Content/Site.css b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Content/Site.css new file mode 100644 index 00000000..59aeb2e8 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Content/Site.css @@ -0,0 +1,317 @@ +/*---------------------------------------------------------- +The base color for this template is #5c87b2. If you'd like +to use a different color start by replacing all instances of +#5c87b2 with your new color. +----------------------------------------------------------*/ +body +{ + background-color: #5c87b2; + font-size: .75em; + font-family: Verdana, Helvetica, Sans-Serif; + margin: 0; + padding: 0; + color: #696969; +} + +a:link +{ + color: #034af3; + text-decoration: underline; +} +a:visited +{ + color: #505abc; +} +a:hover +{ + color: #1d60ff; + text-decoration: none; +} +a:active +{ + color: #12eb87; +} + +p, ul +{ + margin-bottom: 20px; + line-height: 1.6em; +} + +/* HEADINGS +----------------------------------------------------------*/ +h1, h2, h3, h4, h5, h6 +{ + font-size: 1.5em; + color: #000; + font-family: Arial, Helvetica, sans-serif; +} + +h1 +{ + font-size: 2em; + padding-bottom: 0; + margin-bottom: 0; +} +h2 +{ + padding: 0 0 10px 0; +} +h3 +{ + font-size: 1.2em; +} +h4 +{ + font-size: 1.1em; +} +h5, h6 +{ + font-size: 1em; +} + +/* this rule styles

tags that are the +first child of the left and right table columns */ +.rightColumn > h1, .rightColumn > h2, .leftColumn > h1, .leftColumn > h2 +{ + margin-top: 0; +} + +/* PRIMARY LAYOUT ELEMENTS +----------------------------------------------------------*/ + +/* you can specify a greater or lesser percentage for the +page width. Or, you can specify an exact pixel width. */ +.page +{ + width: 90%; + margin-left: auto; + margin-right: auto; +} + +#header +{ + position: relative; + margin-bottom: 0px; + color: #000; + padding: 0; +} + +#header h1 +{ + font-weight: bold; + padding: 5px 0; + margin: 0; + color: #fff; + border: none; + line-height: 2em; + font-family: Arial, Helvetica, sans-serif; + font-size: 32px !important; +} + +#main +{ + padding: 30px 30px 15px 30px; + background-color: #fff; + margin-bottom: 30px; + _height: 1px; /* only IE6 applies CSS properties starting with an underscrore */ +} + +#footer +{ + color: #999; + padding: 10px 0; + text-align: center; + line-height: normal; + margin: 0; + font-size: .9em; +} + +/* TAB MENU +----------------------------------------------------------*/ +ul#menu +{ + border-bottom: 1px #5C87B2 solid; + padding: 0 0 2px; + position: relative; + margin: 0; + text-align: right; +} + +ul#menu li +{ + display: inline; + list-style: none; +} + +ul#menu li#greeting +{ + padding: 10px 20px; + font-weight: bold; + text-decoration: none; + line-height: 2.8em; + color: #fff; +} + +ul#menu li a +{ + padding: 10px 20px; + font-weight: bold; + text-decoration: none; + line-height: 2.8em; + background-color: #e8eef4; + color: #034af3; +} + +ul#menu li a:hover +{ + background-color: #fff; + text-decoration: none; +} + +ul#menu li a:active +{ + background-color: #a6e2a6; + text-decoration: none; +} + +ul#menu li.selected a +{ + background-color: #fff; + color: #000; +} + +/* FORM LAYOUT ELEMENTS +----------------------------------------------------------*/ + +fieldset +{ + margin: 1em 0; + padding: 1em; + border: 1px solid #CCC; +} + +fieldset p +{ + margin: 2px 12px 10px 10px; +} + +fieldset label +{ + display: block; +} + +fieldset label.inline +{ + display: inline; +} + +legend +{ + font-size: 1.1em; + font-weight: 600; + padding: 2px 4px 8px 4px; +} + +input[type="text"] +{ + width: 200px; + border: 1px solid #CCC; +} + +input[type="password"] +{ + width: 200px; + border: 1px solid #CCC; +} + +/* TABLE +----------------------------------------------------------*/ + +table +{ + border: solid 1px #e8eef4; + border-collapse: collapse; +} + +table td +{ + padding: 5px; + border: solid 1px #e8eef4; +} + +table th +{ + padding: 6px 5px; + text-align: left; + background-color: #e8eef4; + border: solid 1px #e8eef4; +} + +/* MISC +----------------------------------------------------------*/ +.clear +{ + clear: both; +} + +.error +{ + color:Red; +} + +#menucontainer +{ + margin-top:40px; +} + +div#title +{ + display:block; + float:left; + text-align:left; +} + +#logindisplay +{ + font-size:1.1em; + display:block; + text-align:right; + margin:10px; + color:White; +} + +#logindisplay a:link +{ + color: white; + text-decoration: underline; +} + +#logindisplay a:visited +{ + color: white; + text-decoration: underline; +} + +#logindisplay a:hover +{ + color: white; + text-decoration: none; +} + +.field-validation-error +{ + color: #ff0000; +} + +.input-validation-error +{ + border: 1px solid #ff0000; + background-color: #ffeeee; +} + +.validation-summary-errors +{ + font-weight: bold; + color: #ff0000; +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Controllers/AccountController.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Controllers/AccountController.cs new file mode 100644 index 00000000..0e85fd37 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Controllers/AccountController.cs @@ -0,0 +1,373 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Security.Principal; +using System.Web; +using System.Web.Mvc; +using System.Web.Security; +using System.Web.UI; + +namespace Gettext.Samples.Mvc.Controllers +{ + + [HandleError] + public class AccountController : Controller + { + + // This constructor is used by the MVC framework to instantiate the controller using + // the default forms authentication and membership providers. + + public AccountController() + : this(null, null) + { + } + + // This constructor is not used by the MVC framework but is instead provided for ease + // of unit testing this type. See the comments at the end of this file for more + // information. + public AccountController(IFormsAuthentication formsAuth, IMembershipService service) + { + FormsAuth = formsAuth ?? new FormsAuthenticationService(); + MembershipService = service ?? new AccountMembershipService(); + } + + public IFormsAuthentication FormsAuth + { + get; + private set; + } + + public IMembershipService MembershipService + { + get; + private set; + } + + public ActionResult LogOn() + { + + return View(); + } + + [AcceptVerbs(HttpVerbs.Post)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", + Justification = "Needs to take same parameter type as Controller.Redirect()")] + public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl) + { + + if (!ValidateLogOn(userName, password)) + { + return View(); + } + + FormsAuth.SignIn(userName, rememberMe); + if (!String.IsNullOrEmpty(returnUrl)) + { + return Redirect(returnUrl); + } + else + { + return RedirectToAction("Index", "Home"); + } + } + + public ActionResult LogOff() + { + + FormsAuth.SignOut(); + + return RedirectToAction("Index", "Home"); + } + + public ActionResult Register() + { + + ViewData["PasswordLength"] = MembershipService.MinPasswordLength; + + return View(); + } + + [AcceptVerbs(HttpVerbs.Post)] + public ActionResult Register(string userName, string email, string password, string confirmPassword) + { + + ViewData["PasswordLength"] = MembershipService.MinPasswordLength; + + if (ValidateRegistration(userName, email, password, confirmPassword)) + { + // Attempt to register the user + MembershipCreateStatus createStatus = MembershipService.CreateUser(userName, password, email); + + if (createStatus == MembershipCreateStatus.Success) + { + FormsAuth.SignIn(userName, false /* createPersistentCookie */); + return RedirectToAction("Index", "Home"); + } + else + { + ModelState.AddModelError("_FORM", ErrorCodeToString(createStatus)); + } + } + + // If we got this far, something failed, redisplay form + return View(); + } + + [Authorize] + public ActionResult ChangePassword() + { + + ViewData["PasswordLength"] = MembershipService.MinPasswordLength; + + return View(); + } + + [Authorize] + [AcceptVerbs(HttpVerbs.Post)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", + Justification = "Exceptions result in password not being changed.")] + public ActionResult ChangePassword(string currentPassword, string newPassword, string confirmPassword) + { + + ViewData["PasswordLength"] = MembershipService.MinPasswordLength; + + if (!ValidateChangePassword(currentPassword, newPassword, confirmPassword)) + { + return View(); + } + + try + { + if (MembershipService.ChangePassword(User.Identity.Name, currentPassword, newPassword)) + { + return RedirectToAction("ChangePasswordSuccess"); + } + else + { + ModelState.AddModelError("_FORM", "The current password is incorrect or the new password is invalid."); + return View(); + } + } + catch + { + ModelState.AddModelError("_FORM", "The current password is incorrect or the new password is invalid."); + return View(); + } + } + + public ActionResult ChangePasswordSuccess() + { + + return View(); + } + + protected override void OnActionExecuting(ActionExecutingContext filterContext) + { + if (filterContext.HttpContext.User.Identity is WindowsIdentity) + { + throw new InvalidOperationException("Windows authentication is not supported."); + } + } + + #region Validation Methods + + private bool ValidateChangePassword(string currentPassword, string newPassword, string confirmPassword) + { + if (String.IsNullOrEmpty(currentPassword)) + { + ModelState.AddModelError("currentPassword", "You must specify a current password."); + } + if (newPassword == null || newPassword.Length < MembershipService.MinPasswordLength) + { + ModelState.AddModelError("newPassword", + String.Format(CultureInfo.CurrentCulture, + "You must specify a new password of {0} or more characters.", + MembershipService.MinPasswordLength)); + } + + if (!String.Equals(newPassword, confirmPassword, StringComparison.Ordinal)) + { + ModelState.AddModelError("_FORM", "The new password and confirmation password do not match."); + } + + return ModelState.IsValid; + } + + private bool ValidateLogOn(string userName, string password) + { + if (String.IsNullOrEmpty(userName)) + { + ModelState.AddModelError("username", "You must specify a username."); + } + if (String.IsNullOrEmpty(password)) + { + ModelState.AddModelError("password", "You must specify a password."); + } + if (!MembershipService.ValidateUser(userName, password)) + { + ModelState.AddModelError("_FORM", "The username or password provided is incorrect."); + } + + return ModelState.IsValid; + } + + private bool ValidateRegistration(string userName, string email, string password, string confirmPassword) + { + if (String.IsNullOrEmpty(userName)) + { + ModelState.AddModelError("username", "You must specify a username."); + } + if (String.IsNullOrEmpty(email)) + { + ModelState.AddModelError("email", "You must specify an email address."); + } + if (password == null || password.Length < MembershipService.MinPasswordLength) + { + ModelState.AddModelError("password", + String.Format(CultureInfo.CurrentCulture, + "You must specify a password of {0} or more characters.", + MembershipService.MinPasswordLength)); + } + if (!String.Equals(password, confirmPassword, StringComparison.Ordinal)) + { + ModelState.AddModelError("_FORM", "The new password and confirmation password do not match."); + } + return ModelState.IsValid; + } + + private static string ErrorCodeToString(MembershipCreateStatus createStatus) + { + // See http://msdn.microsoft.com/en-us/library/system.web.security.membershipcreatestatus.aspx for + // a full list of status codes. + switch (createStatus) + { + case MembershipCreateStatus.DuplicateUserName: + return "Username already exists. Please enter a different user name."; + + case MembershipCreateStatus.DuplicateEmail: + return "A username for that e-mail address already exists. Please enter a different e-mail address."; + + case MembershipCreateStatus.InvalidPassword: + return "The password provided is invalid. Please enter a valid password value."; + + case MembershipCreateStatus.InvalidEmail: + return "The e-mail address provided is invalid. Please check the value and try again."; + + case MembershipCreateStatus.InvalidAnswer: + return "The password retrieval answer provided is invalid. Please check the value and try again."; + + case MembershipCreateStatus.InvalidQuestion: + return "The password retrieval question provided is invalid. Please check the value and try again."; + + case MembershipCreateStatus.InvalidUserName: + return "The user name provided is invalid. Please check the value and try again."; + + case MembershipCreateStatus.ProviderError: + return "The authentication provider returned an error. Please verify your entry and try again. If the problem persists, please contact your system administrator."; + + case MembershipCreateStatus.UserRejected: + return "The user creation request has been canceled. Please verify your entry and try again. If the problem persists, please contact your system administrator."; + + default: + return "An unknown error occurred. Please verify your entry and try again. If the problem persists, please contact your system administrator."; + } + } + #endregion + } + + // The FormsAuthentication type is sealed and contains static members, so it is difficult to + // unit test code that calls its members. The interface and helper class below demonstrate + // how to create an abstract wrapper around such a type in order to make the AccountController + // code unit testable. + + public interface IFormsAuthentication + { + void SignIn(string userName, bool createPersistentCookie); + void SignOut(); + } + + public class FormsAuthenticationService : IFormsAuthentication + { + public void SignIn(string userName, bool createPersistentCookie) + { + FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); + } + public void SignOut() + { + FormsAuthentication.SignOut(); + } + } + + public interface IMembershipService + { + int MinPasswordLength { get; } + + bool ValidateUser(string userName, string password); + MembershipCreateStatus CreateUser(string userName, string password, string email); + bool ChangePassword(string userName, string oldPassword, string newPassword); + } + + public class AccountMembershipService : IMembershipService + { + private MembershipProvider _provider; + + public AccountMembershipService() + : this(null) + { + } + + public AccountMembershipService(MembershipProvider provider) + { + _provider = provider ?? Membership.Provider; + } + + public int MinPasswordLength + { + get + { + return _provider.MinRequiredPasswordLength; + } + } + + public bool ValidateUser(string userName, string password) + { + return _provider.ValidateUser(userName, password); + } + + public MembershipCreateStatus CreateUser(string userName, string password, string email) + { + MembershipCreateStatus status; + _provider.CreateUser(userName, password, email, null, null, true, null, out status); + return status; + } + + public bool ChangePassword(string userName, string oldPassword, string newPassword) + { + MembershipUser currentUser = _provider.GetUser(userName, true /* userIsOnline */); + return currentUser.ChangePassword(oldPassword, newPassword); + } + } +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Controllers/HomeController.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Controllers/HomeController.cs new file mode 100644 index 00000000..2428c197 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Controllers/HomeController.cs @@ -0,0 +1,46 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Mvc; + +namespace Gettext.Samples.Mvc.Controllers +{ + [HandleError] + public class HomeController : Controller + { + public ActionResult Index() + { + ViewData["Message"] = Strings.T("Welcome to internationalized ASP.NET MVC!"); + + return View(); + } + + public ActionResult About() + { + return View(); + } + } +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Default.aspx b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Default.aspx new file mode 100644 index 00000000..62532012 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Default.aspx @@ -0,0 +1,3 @@ +<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Gettext.Samples.Mvc._Default" %> + +<%-- Please do not delete this file. It is used to ensure that ASP.NET MVC is activated by IIS when a user makes a "/" request to the server. --%> diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Default.aspx.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Default.aspx.cs new file mode 100644 index 00000000..ce36e0bc --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Default.aspx.cs @@ -0,0 +1,44 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System.Web; +using System.Web.Mvc; +using System.Web.UI; + +namespace Gettext.Samples.Mvc +{ + public partial class _Default : Page + { + public void Page_Load(object sender, System.EventArgs e) + { + // Change the current path so that the Routing handler can correctly interpret + // the request, then restore the original path so that the OutputCache module + // can correctly process the response (if caching is enabled). + + string originalPath = Request.Path; + HttpContext.Current.RewritePath(Request.ApplicationPath, false); + IHttpHandler httpHandler = new MvcHttpHandler(); + httpHandler.ProcessRequest(HttpContext.Current); + HttpContext.Current.RewritePath(originalPath, false); + } + } +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext.Samples.Mvc.Publish.xml b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext.Samples.Mvc.Publish.xml new file mode 100644 index 00000000..3fd6762b --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext.Samples.Mvc.Publish.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext.Samples.Mvc.csproj b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext.Samples.Mvc.csproj new file mode 100644 index 00000000..152631ee --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext.Samples.Mvc.csproj @@ -0,0 +1,155 @@ + + + Debug + AnyCPU + 9.0.21022 + 2.0 + {208D43F3-84E6-45B9-B6CC-6E3F48E42A82} + {603c0e0b-db56-11dc-be95-000d561079b0};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + Gettext.Samples.Mvc + Gettext.Samples.Mvc + v3.5 + false + + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\ + TRACE + prompt + 4 + + + + + + 3.5 + + + 3.5 + + + + 3.5 + + + + + + + + + + + + + + + + + Default.aspx + ASPXCodeBehind + + + Code + + + Strings.tt + True + True + + + Global.asax + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {38474466-DA21-4D19-A4D8-E2E7918480D6} + Gettext.Cs.Web + + + {D8869765-AB47-4C03-B2C5-E5498A55CA79} + Gettext.Cs + + + + + PreserveNewest + + + PreserveNewest + + + TextTemplatingFileGenerator + Strings.cs + + + + + + + + + + + + + + + + + + + + False + True + 6237 + / + + + False + False + + + + + \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/AspTranslateControl.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/AspTranslateControl.cs new file mode 100644 index 00000000..bc437214 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/AspTranslateControl.cs @@ -0,0 +1,44 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System; +using System.Data; +using System.Configuration; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.HtmlControls; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Xml.Linq; + +namespace Gettext.Samples.Mvc.Controls +{ + public class t : Gettext.Cs.Web.AspTranslate + { + protected override string Translate(string text) + { + return Strings.T(text); + } + } +} diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Extract.bat b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Extract.bat new file mode 100644 index 00000000..63634a3c --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Extract.bat @@ -0,0 +1,32 @@ +rem gettext-cs-utils +rem +rem Copyright 2011 Manas Technology Solutions +rem http://www.manas.com.ar/ +rem +rem This library is free software; you can redistribute it and/or +rem modify it under the terms of the GNU Lesser General Public +rem License as published by the Free Software Foundation; either +rem version 2.1 of the License, or (at your option) any later version. +rem +rem This library is distributed in the hope that it will be useful, +rem but WITHOUT ANY WARRANTY; without even the implied warranty of +rem MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +rem Lesser General Public License for more details. +rem +rem You should have received a copy of the GNU Lesser General Public +rem License along with this library. If not, see . + + +@ECHO OFF + +echo. +echo Setting up global variables... +SET path_xgettext=..\..\..\Bin\Gnu.Gettext.Win32\xgettext.exe +SET path_aspextract=..\..\..\Tools\Gettext.AspExtract\bin\Debug\AspExtract.exe +SET path_output=.\Templates +SET file_list=..\*.cs +SET asp_files_root=.. + +echo. +echo Generating strings po file... +CALL ..\..\..\Scripts\ExtractAspNetStrings.bat Strings \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Po/en/Strings.po b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Po/en/Strings.po new file mode 100644 index 00000000..13efaae9 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Po/en/Strings.po @@ -0,0 +1,16 @@ +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Controllers\HomeController.cs:14 +msgid "Welcome to internationalized ASP.NET MVC!" +msgstr "" + +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Views\Home\Index.aspx.postrings:1 +msgid "Hello world" +msgstr "" + +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Views\Home\Index.aspx.postrings:2 +#, csharp-format +msgid "Go to the {0} page." +msgstr "" + +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Views\Home\Index.aspx.postrings:3 +msgid "home" +msgstr "" diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Po/es/Strings.po b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Po/es/Strings.po new file mode 100644 index 00000000..ce7c4d3a --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Po/es/Strings.po @@ -0,0 +1,16 @@ +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Controllers\HomeController.cs:14 +msgid "Welcome to internationalized ASP.NET MVC!" +msgstr "Bienvenido a ASP.NET MVC internacionalizado!" + +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Views\Home\Index.aspx.postrings:1 +msgid "Hello world" +msgstr "Hola mundo" + +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Views\Home\Index.aspx.postrings:2 +#, csharp-format +msgid "Go to the {0} page." +msgstr "Ir a la página de {0}." + +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Views\Home\Index.aspx.postrings:3 +msgid "home" +msgstr "inicio" diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Strings.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Strings.cs new file mode 100644 index 00000000..40bbcc34 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Strings.cs @@ -0,0 +1,170 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + + +// +// This code was generated by a tool. Any changes made manually will be lost +// the next time this code is regenerated. +// + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Globalization; +using System.Threading; +using System.Configuration; +using System.Diagnostics; +using System.IO; +using System.Reflection; + +namespace Gettext.Samples.Mvc +{ + public class Strings + { + private static Object resourceManLock = new Object(); + private static System.Resources.ResourceManager resourceMan; + private static System.Globalization.CultureInfo resourceCulture; + + public const string ResourceName = "Strings"; + + private static string resourcesDir = GetSetting("ResourcesDir", "Po"); + private static string fileFormat = GetSetting("ResourcesFileFormat", "{{culture}}/{{resource}}.po"); + + private static string GetSetting(string setting, string defaultValue) + { + var section = (System.Collections.Specialized.NameValueCollection)System.Configuration.ConfigurationManager.GetSection("appSettings"); + if (section == null) return defaultValue; + else return section[setting] ?? defaultValue; + } + + + /// + /// Resources directory used to retrieve files from. + /// + public static string ResourcesDirectory + { + get { return resourcesDir; } + set { resourcesDir = value; } + } + + /// + /// Format of the file based on culture and resource name. + /// + public static string FileFormat + { + get { return fileFormat; } + set { fileFormat = value; } + } + + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + public static System.Resources.ResourceManager ResourceManager + { + get + { + + if (object.ReferenceEquals(resourceMan, null)) + { + lock (resourceManLock) + { + if (object.ReferenceEquals(resourceMan, null)) + { + var directory = resourcesDir; + if (System.Web.HttpContext.Current != null) + directory = System.Web.HttpContext.Current.Server.MapPath(directory); + var mgr = new global::Gettext.Cs.GettextResourceManager(ResourceName, directory, fileFormat); + resourceMan = mgr; + } + } + } + + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + public static System.Globalization.CultureInfo Culture + { + get { return resourceCulture; } + set { resourceCulture = value; } + } + + /// + /// Looks up a localized string; used to mark string for translation as well. + /// + public static string T(string t) + { + return T(null, t); + } + + /// + /// Looks up a localized string; used to mark string for translation as well. + /// + public static string T(CultureInfo info, string t) + { + if (String.IsNullOrEmpty(t)) return t; + var translated = ResourceManager.GetString(t, info ?? resourceCulture); + return String.IsNullOrEmpty(translated) ? t : translated; + } + + /// + /// Looks up a localized string and formats it with the parameters provided; used to mark string for translation as well. + /// + public static string T(string t, params object[] parameters) + { + return T(null, t, parameters); + } + + /// + /// Looks up a localized string and formats it with the parameters provided; used to mark string for translation as well. + /// + public static string T(CultureInfo info, string t, params object[] parameters) + { + if (String.IsNullOrEmpty(t)) return t; + return String.Format(T(info, t), parameters); + } + + /// + /// Marks a string for future translation, does not translate it now. + /// + public static string M(string t) + { + return t; + } + + /// + /// Returns the resource set available for the specified culture. + /// + public static System.Resources.ResourceSet GetResourceSet(CultureInfo culture) + { + return ResourceManager.GetResourceSet(culture, true, true); + } + } +} + + diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Strings.tt b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Strings.tt new file mode 100644 index 00000000..7fc214f6 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Strings.tt @@ -0,0 +1,9 @@ +<#@ assembly name="System.Configuration" #> + +<# + this.ClassName = "Strings"; + this.ResourceName = "Strings"; + this.NamespaceName = "Gettext.Samples.Mvc"; + this.ServerMapPath = true; +#> +<#@ include file="..\..\..\Core\Gettext.Cs\Templates\Strings.tt" #> diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Templates/Strings.pot b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Templates/Strings.pot new file mode 100644 index 00000000..4ee25a70 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Gettext/Templates/Strings.pot @@ -0,0 +1,16 @@ +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Controllers\HomeController.cs:14 +msgid "Welcome to internationalized ASP.NET MVC!" +msgstr "" + +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Views\Home\Index.aspx.postrings:1 +msgid "Hello world" +msgstr "" + +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Views\Home\Index.aspx.postrings:2 +#, csharp-format +msgid "Go to the {0} page." +msgstr "" + +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Views\Home\Index.aspx.postrings:3 +msgid "home" +msgstr "" diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Global.asax b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Global.asax new file mode 100644 index 00000000..d41d5e66 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Global.asax @@ -0,0 +1 @@ +<%@ Application Codebehind="Global.asax.cs" Inherits="Gettext.Samples.Mvc.MvcApplication" Language="C#" %> diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Global.asax.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Global.asax.cs new file mode 100644 index 00000000..8865a049 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Global.asax.cs @@ -0,0 +1,54 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Mvc; +using System.Web.Routing; + +namespace Gettext.Samples.Mvc +{ + // Note: For instructions on enabling IIS6 or IIS7 classic mode, + // visit http://go.microsoft.com/?LinkId=9394801 + + public class MvcApplication : System.Web.HttpApplication + { + public static void RegisterRoutes(RouteCollection routes) + { + routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); + + routes.MapRoute( + "Default", // Route name + "{controller}/{action}/{id}", // URL with parameters + new { controller = "Home", action = "Index", id = "" } // Parameter defaults + ); + + } + + protected void Application_Start() + { + RegisterRoutes(RouteTable.Routes); + } + } +} \ No newline at end of file diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Po/en/Strings.po b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Po/en/Strings.po new file mode 100644 index 00000000..4ee25a70 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Po/en/Strings.po @@ -0,0 +1,16 @@ +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Controllers\HomeController.cs:14 +msgid "Welcome to internationalized ASP.NET MVC!" +msgstr "" + +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Views\Home\Index.aspx.postrings:1 +msgid "Hello world" +msgstr "" + +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Views\Home\Index.aspx.postrings:2 +#, csharp-format +msgid "Go to the {0} page." +msgstr "" + +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Views\Home\Index.aspx.postrings:3 +msgid "home" +msgstr "" diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Po/es/Strings.po b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Po/es/Strings.po new file mode 100644 index 00000000..40c75ac8 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Po/es/Strings.po @@ -0,0 +1,16 @@ +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Controllers\HomeController.cs:14 +msgid "Welcome to internationalized ASP.NET MVC!" +msgstr "Bienvenido a ASP.NET MVC internacionalizado!" + +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Views\Home\Index.aspx.postrings:1 +msgid "Hello world" +msgstr "Hola mundo" + +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Views\Home\Index.aspx.postrings:2 +#, csharp-format +msgid "Go to the {0} page." +msgstr "Ir a la página de {0}." + +#: E:\Gettext\cs-utils\Gettext.CsUtils\Samples\Gettext.Samples.Mvc\Views\Home\Index.aspx.postrings:3 +msgid "home" +msgstr "inicio" diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Properties/AssemblyInfo.cs b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..350925c2 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Properties/AssemblyInfo.cs @@ -0,0 +1,57 @@ +/** + * gettext-cs-utils + * + * Copyright 2011 Manas Technology Solutions + * http://www.manas.com.ar/ + * + * 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, see . + * + **/ + + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 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("Gettext.Samples.Mvc")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Gettext.Samples.Mvc")] +[assembly: AssemblyCopyright("Copyright © 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f196ad9a-551e-4a6d-8635-413e36224086")] + +// 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: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/MicrosoftAjax.debug.js b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/MicrosoftAjax.debug.js new file mode 100644 index 00000000..7b7de621 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/MicrosoftAjax.debug.js @@ -0,0 +1,6850 @@ +// Name: MicrosoftAjax.debug.js +// Assembly: System.Web.Extensions +// Version: 3.5.0.0 +// FileVersion: 3.5.30729.1 +//----------------------------------------------------------------------- +// Copyright (C) Microsoft Corporation. All rights reserved. +//----------------------------------------------------------------------- +// MicrosoftAjax.js +// Microsoft AJAX Framework. + +Function.__typeName = 'Function'; +Function.__class = true; +Function.createCallback = function Function$createCallback(method, context) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "method", type: Function}, + {name: "context", mayBeNull: true} + ]); + if (e) throw e; + return function() { + var l = arguments.length; + if (l > 0) { + var args = []; + for (var i = 0; i < l; i++) { + args[i] = arguments[i]; + } + args[l] = context; + return method.apply(this, args); + } + return method.call(this, context); + } +} +Function.createDelegate = function Function$createDelegate(instance, method) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "instance", mayBeNull: true}, + {name: "method", type: Function} + ]); + if (e) throw e; + return function() { + return method.apply(instance, arguments); + } +} +Function.emptyFunction = Function.emptyMethod = function Function$emptyMethod() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); +} +Function._validateParams = function Function$_validateParams(params, expectedParams) { + var e; + e = Function._validateParameterCount(params, expectedParams); + if (e) { + e.popStackFrame(); + return e; + } + for (var i=0; i < params.length; i++) { + var expectedParam = expectedParams[Math.min(i, expectedParams.length - 1)]; + var paramName = expectedParam.name; + if (expectedParam.parameterArray) { + paramName += "[" + (i - expectedParams.length + 1) + "]"; + } + e = Function._validateParameter(params[i], expectedParam, paramName); + if (e) { + e.popStackFrame(); + return e; + } + } + return null; +} +Function._validateParameterCount = function Function$_validateParameterCount(params, expectedParams) { + var maxParams = expectedParams.length; + var minParams = 0; + for (var i=0; i < expectedParams.length; i++) { + if (expectedParams[i].parameterArray) { + maxParams = Number.MAX_VALUE; + } + else if (!expectedParams[i].optional) { + minParams++; + } + } + if (params.length < minParams || params.length > maxParams) { + var e = Error.parameterCount(); + e.popStackFrame(); + return e; + } + return null; +} +Function._validateParameter = function Function$_validateParameter(param, expectedParam, paramName) { + var e; + var expectedType = expectedParam.type; + var expectedInteger = !!expectedParam.integer; + var expectedDomElement = !!expectedParam.domElement; + var mayBeNull = !!expectedParam.mayBeNull; + e = Function._validateParameterType(param, expectedType, expectedInteger, expectedDomElement, mayBeNull, paramName); + if (e) { + e.popStackFrame(); + return e; + } + var expectedElementType = expectedParam.elementType; + var elementMayBeNull = !!expectedParam.elementMayBeNull; + if (expectedType === Array && typeof(param) !== "undefined" && param !== null && + (expectedElementType || !elementMayBeNull)) { + var expectedElementInteger = !!expectedParam.elementInteger; + var expectedElementDomElement = !!expectedParam.elementDomElement; + for (var i=0; i < param.length; i++) { + var elem = param[i]; + e = Function._validateParameterType(elem, expectedElementType, + expectedElementInteger, expectedElementDomElement, elementMayBeNull, + paramName + "[" + i + "]"); + if (e) { + e.popStackFrame(); + return e; + } + } + } + return null; +} +Function._validateParameterType = function Function$_validateParameterType(param, expectedType, expectedInteger, expectedDomElement, mayBeNull, paramName) { + var e; + if (typeof(param) === "undefined") { + if (mayBeNull) { + return null; + } + else { + e = Error.argumentUndefined(paramName); + e.popStackFrame(); + return e; + } + } + if (param === null) { + if (mayBeNull) { + return null; + } + else { + e = Error.argumentNull(paramName); + e.popStackFrame(); + return e; + } + } + if (expectedType && expectedType.__enum) { + if (typeof(param) !== 'number') { + e = Error.argumentType(paramName, Object.getType(param), expectedType); + e.popStackFrame(); + return e; + } + if ((param % 1) === 0) { + var values = expectedType.prototype; + if (!expectedType.__flags || (param === 0)) { + for (var i in values) { + if (values[i] === param) return null; + } + } + else { + var v = param; + for (var i in values) { + var vali = values[i]; + if (vali === 0) continue; + if ((vali & param) === vali) { + v -= vali; + } + if (v === 0) return null; + } + } + } + e = Error.argumentOutOfRange(paramName, param, String.format(Sys.Res.enumInvalidValue, param, expectedType.getName())); + e.popStackFrame(); + return e; + } + if (expectedDomElement) { + var val; + if (typeof(param.nodeType) !== 'number') { + var doc = param.ownerDocument || param.document || param; + if (doc != param) { + var w = doc.defaultView || doc.parentWindow; + val = (w != param) && !(w.document && param.document && (w.document === param.document)); + } + else { + val = (typeof(doc.body) === 'undefined'); + } + } + else { + val = (param.nodeType === 3); + } + if (val) { + e = Error.argument(paramName, Sys.Res.argumentDomElement); + e.popStackFrame(); + return e; + } + } + if (expectedType && !expectedType.isInstanceOfType(param)) { + e = Error.argumentType(paramName, Object.getType(param), expectedType); + e.popStackFrame(); + return e; + } + if (expectedType === Number && expectedInteger) { + if ((param % 1) !== 0) { + e = Error.argumentOutOfRange(paramName, param, Sys.Res.argumentInteger); + e.popStackFrame(); + return e; + } + } + return null; +} + +Error.__typeName = 'Error'; +Error.__class = true; +Error.create = function Error$create(message, errorInfo) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "message", type: String, mayBeNull: true, optional: true}, + {name: "errorInfo", mayBeNull: true, optional: true} + ]); + if (e) throw e; + var e = new Error(message); + e.message = message; + if (errorInfo) { + for (var v in errorInfo) { + e[v] = errorInfo[v]; + } + } + e.popStackFrame(); + return e; +} +Error.argument = function Error$argument(paramName, message) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "paramName", type: String, mayBeNull: true, optional: true}, + {name: "message", type: String, mayBeNull: true, optional: true} + ]); + if (e) throw e; + var displayMessage = "Sys.ArgumentException: " + (message ? message : Sys.Res.argument); + if (paramName) { + displayMessage += "\n" + String.format(Sys.Res.paramName, paramName); + } + var e = Error.create(displayMessage, { name: "Sys.ArgumentException", paramName: paramName }); + e.popStackFrame(); + return e; +} +Error.argumentNull = function Error$argumentNull(paramName, message) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "paramName", type: String, mayBeNull: true, optional: true}, + {name: "message", type: String, mayBeNull: true, optional: true} + ]); + if (e) throw e; + var displayMessage = "Sys.ArgumentNullException: " + (message ? message : Sys.Res.argumentNull); + if (paramName) { + displayMessage += "\n" + String.format(Sys.Res.paramName, paramName); + } + var e = Error.create(displayMessage, { name: "Sys.ArgumentNullException", paramName: paramName }); + e.popStackFrame(); + return e; +} +Error.argumentOutOfRange = function Error$argumentOutOfRange(paramName, actualValue, message) { + /// + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "paramName", type: String, mayBeNull: true, optional: true}, + {name: "actualValue", mayBeNull: true, optional: true}, + {name: "message", type: String, mayBeNull: true, optional: true} + ]); + if (e) throw e; + var displayMessage = "Sys.ArgumentOutOfRangeException: " + (message ? message : Sys.Res.argumentOutOfRange); + if (paramName) { + displayMessage += "\n" + String.format(Sys.Res.paramName, paramName); + } + if (typeof(actualValue) !== "undefined" && actualValue !== null) { + displayMessage += "\n" + String.format(Sys.Res.actualValue, actualValue); + } + var e = Error.create(displayMessage, { + name: "Sys.ArgumentOutOfRangeException", + paramName: paramName, + actualValue: actualValue + }); + e.popStackFrame(); + return e; +} +Error.argumentType = function Error$argumentType(paramName, actualType, expectedType, message) { + /// + /// + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "paramName", type: String, mayBeNull: true, optional: true}, + {name: "actualType", type: Type, mayBeNull: true, optional: true}, + {name: "expectedType", type: Type, mayBeNull: true, optional: true}, + {name: "message", type: String, mayBeNull: true, optional: true} + ]); + if (e) throw e; + var displayMessage = "Sys.ArgumentTypeException: "; + if (message) { + displayMessage += message; + } + else if (actualType && expectedType) { + displayMessage += + String.format(Sys.Res.argumentTypeWithTypes, actualType.getName(), expectedType.getName()); + } + else { + displayMessage += Sys.Res.argumentType; + } + if (paramName) { + displayMessage += "\n" + String.format(Sys.Res.paramName, paramName); + } + var e = Error.create(displayMessage, { + name: "Sys.ArgumentTypeException", + paramName: paramName, + actualType: actualType, + expectedType: expectedType + }); + e.popStackFrame(); + return e; +} +Error.argumentUndefined = function Error$argumentUndefined(paramName, message) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "paramName", type: String, mayBeNull: true, optional: true}, + {name: "message", type: String, mayBeNull: true, optional: true} + ]); + if (e) throw e; + var displayMessage = "Sys.ArgumentUndefinedException: " + (message ? message : Sys.Res.argumentUndefined); + if (paramName) { + displayMessage += "\n" + String.format(Sys.Res.paramName, paramName); + } + var e = Error.create(displayMessage, { name: "Sys.ArgumentUndefinedException", paramName: paramName }); + e.popStackFrame(); + return e; +} +Error.format = function Error$format(message) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "message", type: String, mayBeNull: true, optional: true} + ]); + if (e) throw e; + var displayMessage = "Sys.FormatException: " + (message ? message : Sys.Res.format); + var e = Error.create(displayMessage, {name: 'Sys.FormatException'}); + e.popStackFrame(); + return e; +} +Error.invalidOperation = function Error$invalidOperation(message) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "message", type: String, mayBeNull: true, optional: true} + ]); + if (e) throw e; + var displayMessage = "Sys.InvalidOperationException: " + (message ? message : Sys.Res.invalidOperation); + var e = Error.create(displayMessage, {name: 'Sys.InvalidOperationException'}); + e.popStackFrame(); + return e; +} +Error.notImplemented = function Error$notImplemented(message) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "message", type: String, mayBeNull: true, optional: true} + ]); + if (e) throw e; + var displayMessage = "Sys.NotImplementedException: " + (message ? message : Sys.Res.notImplemented); + var e = Error.create(displayMessage, {name: 'Sys.NotImplementedException'}); + e.popStackFrame(); + return e; +} +Error.parameterCount = function Error$parameterCount(message) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "message", type: String, mayBeNull: true, optional: true} + ]); + if (e) throw e; + var displayMessage = "Sys.ParameterCountException: " + (message ? message : Sys.Res.parameterCount); + var e = Error.create(displayMessage, {name: 'Sys.ParameterCountException'}); + e.popStackFrame(); + return e; +} +Error.prototype.popStackFrame = function Error$popStackFrame() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (typeof(this.stack) === "undefined" || this.stack === null || + typeof(this.fileName) === "undefined" || this.fileName === null || + typeof(this.lineNumber) === "undefined" || this.lineNumber === null) { + return; + } + var stackFrames = this.stack.split("\n"); + var currentFrame = stackFrames[0]; + var pattern = this.fileName + ":" + this.lineNumber; + while(typeof(currentFrame) !== "undefined" && + currentFrame !== null && + currentFrame.indexOf(pattern) === -1) { + stackFrames.shift(); + currentFrame = stackFrames[0]; + } + var nextFrame = stackFrames[1]; + if (typeof(nextFrame) === "undefined" || nextFrame === null) { + return; + } + var nextFrameParts = nextFrame.match(/@(.*):(\d+)$/); + if (typeof(nextFrameParts) === "undefined" || nextFrameParts === null) { + return; + } + this.fileName = nextFrameParts[1]; + this.lineNumber = parseInt(nextFrameParts[2]); + stackFrames.shift(); + this.stack = stackFrames.join("\n"); +} + +Object.__typeName = 'Object'; +Object.__class = true; +Object.getType = function Object$getType(instance) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "instance"} + ]); + if (e) throw e; + var ctor = instance.constructor; + if (!ctor || (typeof(ctor) !== "function") || !ctor.__typeName || (ctor.__typeName === 'Object')) { + return Object; + } + return ctor; +} +Object.getTypeName = function Object$getTypeName(instance) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "instance"} + ]); + if (e) throw e; + return Object.getType(instance).getName(); +} + +String.__typeName = 'String'; +String.__class = true; +String.prototype.endsWith = function String$endsWith(suffix) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "suffix", type: String} + ]); + if (e) throw e; + return (this.substr(this.length - suffix.length) === suffix); +} +String.prototype.startsWith = function String$startsWith(prefix) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "prefix", type: String} + ]); + if (e) throw e; + return (this.substr(0, prefix.length) === prefix); +} +String.prototype.trim = function String$trim() { + /// + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this.replace(/^\s+|\s+$/g, ''); +} +String.prototype.trimEnd = function String$trimEnd() { + /// + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this.replace(/\s+$/, ''); +} +String.prototype.trimStart = function String$trimStart() { + /// + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this.replace(/^\s+/, ''); +} +String.format = function String$format(format, args) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "format", type: String}, + {name: "args", mayBeNull: true, parameterArray: true} + ]); + if (e) throw e; + return String._toFormattedString(false, arguments); +} +String.localeFormat = function String$localeFormat(format, args) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "format", type: String}, + {name: "args", mayBeNull: true, parameterArray: true} + ]); + if (e) throw e; + return String._toFormattedString(true, arguments); +} +String._toFormattedString = function String$_toFormattedString(useLocale, args) { + var result = ''; + var format = args[0]; + for (var i=0;;) { + var open = format.indexOf('{', i); + var close = format.indexOf('}', i); + if ((open < 0) && (close < 0)) { + result += format.slice(i); + break; + } + if ((close > 0) && ((close < open) || (open < 0))) { + if (format.charAt(close + 1) !== '}') { + throw Error.argument('format', Sys.Res.stringFormatBraceMismatch); + } + result += format.slice(i, close + 1); + i = close + 2; + continue; + } + result += format.slice(i, open); + i = open + 1; + if (format.charAt(i) === '{') { + result += '{'; + i++; + continue; + } + if (close < 0) throw Error.argument('format', Sys.Res.stringFormatBraceMismatch); + var brace = format.substring(i, close); + var colonIndex = brace.indexOf(':'); + var argNumber = parseInt((colonIndex < 0)? brace : brace.substring(0, colonIndex), 10) + 1; + if (isNaN(argNumber)) throw Error.argument('format', Sys.Res.stringFormatInvalid); + var argFormat = (colonIndex < 0)? '' : brace.substring(colonIndex + 1); + var arg = args[argNumber]; + if (typeof(arg) === "undefined" || arg === null) { + arg = ''; + } + if (arg.toFormattedString) { + result += arg.toFormattedString(argFormat); + } + else if (useLocale && arg.localeFormat) { + result += arg.localeFormat(argFormat); + } + else if (arg.format) { + result += arg.format(argFormat); + } + else + result += arg.toString(); + i = close + 1; + } + return result; +} + +Boolean.__typeName = 'Boolean'; +Boolean.__class = true; +Boolean.parse = function Boolean$parse(value) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "value", type: String} + ]); + if (e) throw e; + var v = value.trim().toLowerCase(); + if (v === 'false') return false; + if (v === 'true') return true; + throw Error.argumentOutOfRange('value', value, Sys.Res.boolTrueOrFalse); +} + +Date.__typeName = 'Date'; +Date.__class = true; +Date._appendPreOrPostMatch = function Date$_appendPreOrPostMatch(preMatch, strBuilder) { + var quoteCount = 0; + var escaped = false; + for (var i = 0, il = preMatch.length; i < il; i++) { + var c = preMatch.charAt(i); + switch (c) { + case '\'': + if (escaped) strBuilder.append("'"); + else quoteCount++; + escaped = false; + break; + case '\\': + if (escaped) strBuilder.append("\\"); + escaped = !escaped; + break; + default: + strBuilder.append(c); + escaped = false; + break; + } + } + return quoteCount; +} +Date._expandFormat = function Date$_expandFormat(dtf, format) { + if (!format) { + format = "F"; + } + if (format.length === 1) { + switch (format) { + case "d": + return dtf.ShortDatePattern; + case "D": + return dtf.LongDatePattern; + case "t": + return dtf.ShortTimePattern; + case "T": + return dtf.LongTimePattern; + case "F": + return dtf.FullDateTimePattern; + case "M": case "m": + return dtf.MonthDayPattern; + case "s": + return dtf.SortableDateTimePattern; + case "Y": case "y": + return dtf.YearMonthPattern; + default: + throw Error.format(Sys.Res.formatInvalidString); + } + } + return format; +} +Date._expandYear = function Date$_expandYear(dtf, year) { + if (year < 100) { + var curr = new Date().getFullYear(); + year += curr - (curr % 100); + if (year > dtf.Calendar.TwoDigitYearMax) { + return year - 100; + } + } + return year; +} +Date._getParseRegExp = function Date$_getParseRegExp(dtf, format) { + if (!dtf._parseRegExp) { + dtf._parseRegExp = {}; + } + else if (dtf._parseRegExp[format]) { + return dtf._parseRegExp[format]; + } + var expFormat = Date._expandFormat(dtf, format); + expFormat = expFormat.replace(/([\^\$\.\*\+\?\|\[\]\(\)\{\}])/g, "\\\\$1"); + var regexp = new Sys.StringBuilder("^"); + var groups = []; + var index = 0; + var quoteCount = 0; + var tokenRegExp = Date._getTokenRegExp(); + var match; + while ((match = tokenRegExp.exec(expFormat)) !== null) { + var preMatch = expFormat.slice(index, match.index); + index = tokenRegExp.lastIndex; + quoteCount += Date._appendPreOrPostMatch(preMatch, regexp); + if ((quoteCount%2) === 1) { + regexp.append(match[0]); + continue; + } + switch (match[0]) { + case 'dddd': case 'ddd': + case 'MMMM': case 'MMM': + regexp.append("(\\D+)"); + break; + case 'tt': case 't': + regexp.append("(\\D*)"); + break; + case 'yyyy': + regexp.append("(\\d{4})"); + break; + case 'fff': + regexp.append("(\\d{3})"); + break; + case 'ff': + regexp.append("(\\d{2})"); + break; + case 'f': + regexp.append("(\\d)"); + break; + case 'dd': case 'd': + case 'MM': case 'M': + case 'yy': case 'y': + case 'HH': case 'H': + case 'hh': case 'h': + case 'mm': case 'm': + case 'ss': case 's': + regexp.append("(\\d\\d?)"); + break; + case 'zzz': + regexp.append("([+-]?\\d\\d?:\\d{2})"); + break; + case 'zz': case 'z': + regexp.append("([+-]?\\d\\d?)"); + break; + } + Array.add(groups, match[0]); + } + Date._appendPreOrPostMatch(expFormat.slice(index), regexp); + regexp.append("$"); + var regexpStr = regexp.toString().replace(/\s+/g, "\\s+"); + var parseRegExp = {'regExp': regexpStr, 'groups': groups}; + dtf._parseRegExp[format] = parseRegExp; + return parseRegExp; +} +Date._getTokenRegExp = function Date$_getTokenRegExp() { + return /dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z/g; +} +Date.parseLocale = function Date$parseLocale(value, formats) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "value", type: String}, + {name: "formats", mayBeNull: true, optional: true, parameterArray: true} + ]); + if (e) throw e; + return Date._parse(value, Sys.CultureInfo.CurrentCulture, arguments); +} +Date.parseInvariant = function Date$parseInvariant(value, formats) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "value", type: String}, + {name: "formats", mayBeNull: true, optional: true, parameterArray: true} + ]); + if (e) throw e; + return Date._parse(value, Sys.CultureInfo.InvariantCulture, arguments); +} +Date._parse = function Date$_parse(value, cultureInfo, args) { + var custom = false; + for (var i = 1, il = args.length; i < il; i++) { + var format = args[i]; + if (format) { + custom = true; + var date = Date._parseExact(value, format, cultureInfo); + if (date) return date; + } + } + if (! custom) { + var formats = cultureInfo._getDateTimeFormats(); + for (var i = 0, il = formats.length; i < il; i++) { + var date = Date._parseExact(value, formats[i], cultureInfo); + if (date) return date; + } + } + return null; +} +Date._parseExact = function Date$_parseExact(value, format, cultureInfo) { + value = value.trim(); + var dtf = cultureInfo.dateTimeFormat; + var parseInfo = Date._getParseRegExp(dtf, format); + var match = new RegExp(parseInfo.regExp).exec(value); + if (match === null) return null; + + var groups = parseInfo.groups; + var year = null, month = null, date = null, weekDay = null; + var hour = 0, min = 0, sec = 0, msec = 0, tzMinOffset = null; + var pmHour = false; + for (var j = 0, jl = groups.length; j < jl; j++) { + var matchGroup = match[j+1]; + if (matchGroup) { + switch (groups[j]) { + case 'dd': case 'd': + date = parseInt(matchGroup, 10); + if ((date < 1) || (date > 31)) return null; + break; + case 'MMMM': + month = cultureInfo._getMonthIndex(matchGroup); + if ((month < 0) || (month > 11)) return null; + break; + case 'MMM': + month = cultureInfo._getAbbrMonthIndex(matchGroup); + if ((month < 0) || (month > 11)) return null; + break; + case 'M': case 'MM': + var month = parseInt(matchGroup, 10) - 1; + if ((month < 0) || (month > 11)) return null; + break; + case 'y': case 'yy': + year = Date._expandYear(dtf,parseInt(matchGroup, 10)); + if ((year < 0) || (year > 9999)) return null; + break; + case 'yyyy': + year = parseInt(matchGroup, 10); + if ((year < 0) || (year > 9999)) return null; + break; + case 'h': case 'hh': + hour = parseInt(matchGroup, 10); + if (hour === 12) hour = 0; + if ((hour < 0) || (hour > 11)) return null; + break; + case 'H': case 'HH': + hour = parseInt(matchGroup, 10); + if ((hour < 0) || (hour > 23)) return null; + break; + case 'm': case 'mm': + min = parseInt(matchGroup, 10); + if ((min < 0) || (min > 59)) return null; + break; + case 's': case 'ss': + sec = parseInt(matchGroup, 10); + if ((sec < 0) || (sec > 59)) return null; + break; + case 'tt': case 't': + var upperToken = matchGroup.toUpperCase(); + pmHour = (upperToken === dtf.PMDesignator.toUpperCase()); + if (!pmHour && (upperToken !== dtf.AMDesignator.toUpperCase())) return null; + break; + case 'f': + msec = parseInt(matchGroup, 10) * 100; + if ((msec < 0) || (msec > 999)) return null; + break; + case 'ff': + msec = parseInt(matchGroup, 10) * 10; + if ((msec < 0) || (msec > 999)) return null; + break; + case 'fff': + msec = parseInt(matchGroup, 10); + if ((msec < 0) || (msec > 999)) return null; + break; + case 'dddd': + weekDay = cultureInfo._getDayIndex(matchGroup); + if ((weekDay < 0) || (weekDay > 6)) return null; + break; + case 'ddd': + weekDay = cultureInfo._getAbbrDayIndex(matchGroup); + if ((weekDay < 0) || (weekDay > 6)) return null; + break; + case 'zzz': + var offsets = matchGroup.split(/:/); + if (offsets.length !== 2) return null; + var hourOffset = parseInt(offsets[0], 10); + if ((hourOffset < -12) || (hourOffset > 13)) return null; + var minOffset = parseInt(offsets[1], 10); + if ((minOffset < 0) || (minOffset > 59)) return null; + tzMinOffset = (hourOffset * 60) + (matchGroup.startsWith('-')? -minOffset : minOffset); + break; + case 'z': case 'zz': + var hourOffset = parseInt(matchGroup, 10); + if ((hourOffset < -12) || (hourOffset > 13)) return null; + tzMinOffset = hourOffset * 60; + break; + } + } + } + var result = new Date(); + if (year === null) { + year = result.getFullYear(); + } + if (month === null) { + month = result.getMonth(); + } + if (date === null) { + date = result.getDate(); + } + result.setFullYear(year, month, date); + if (result.getDate() !== date) return null; + if ((weekDay !== null) && (result.getDay() !== weekDay)) { + return null; + } + if (pmHour && (hour < 12)) { + hour += 12; + } + result.setHours(hour, min, sec, msec); + if (tzMinOffset !== null) { + var adjustedMin = result.getMinutes() - (tzMinOffset + result.getTimezoneOffset()); + result.setHours(result.getHours() + parseInt(adjustedMin/60, 10), adjustedMin%60); + } + return result; +} +Date.prototype.format = function Date$format(format) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "format", type: String} + ]); + if (e) throw e; + return this._toFormattedString(format, Sys.CultureInfo.InvariantCulture); +} +Date.prototype.localeFormat = function Date$localeFormat(format) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "format", type: String} + ]); + if (e) throw e; + return this._toFormattedString(format, Sys.CultureInfo.CurrentCulture); +} +Date.prototype._toFormattedString = function Date$_toFormattedString(format, cultureInfo) { + if (!format || (format.length === 0) || (format === 'i')) { + if (cultureInfo && (cultureInfo.name.length > 0)) { + return this.toLocaleString(); + } + else { + return this.toString(); + } + } + var dtf = cultureInfo.dateTimeFormat; + format = Date._expandFormat(dtf, format); + var ret = new Sys.StringBuilder(); + var hour; + function addLeadingZero(num) { + if (num < 10) { + return '0' + num; + } + return num.toString(); + } + function addLeadingZeros(num) { + if (num < 10) { + return '00' + num; + } + if (num < 100) { + return '0' + num; + } + return num.toString(); + } + var quoteCount = 0; + var tokenRegExp = Date._getTokenRegExp(); + for (;;) { + var index = tokenRegExp.lastIndex; + var ar = tokenRegExp.exec(format); + var preMatch = format.slice(index, ar ? ar.index : format.length); + quoteCount += Date._appendPreOrPostMatch(preMatch, ret); + if (!ar) break; + if ((quoteCount%2) === 1) { + ret.append(ar[0]); + continue; + } + switch (ar[0]) { + case "dddd": + ret.append(dtf.DayNames[this.getDay()]); + break; + case "ddd": + ret.append(dtf.AbbreviatedDayNames[this.getDay()]); + break; + case "dd": + ret.append(addLeadingZero(this.getDate())); + break; + case "d": + ret.append(this.getDate()); + break; + case "MMMM": + ret.append(dtf.MonthNames[this.getMonth()]); + break; + case "MMM": + ret.append(dtf.AbbreviatedMonthNames[this.getMonth()]); + break; + case "MM": + ret.append(addLeadingZero(this.getMonth() + 1)); + break; + case "M": + ret.append(this.getMonth() + 1); + break; + case "yyyy": + ret.append(this.getFullYear()); + break; + case "yy": + ret.append(addLeadingZero(this.getFullYear() % 100)); + break; + case "y": + ret.append(this.getFullYear() % 100); + break; + case "hh": + hour = this.getHours() % 12; + if (hour === 0) hour = 12; + ret.append(addLeadingZero(hour)); + break; + case "h": + hour = this.getHours() % 12; + if (hour === 0) hour = 12; + ret.append(hour); + break; + case "HH": + ret.append(addLeadingZero(this.getHours())); + break; + case "H": + ret.append(this.getHours()); + break; + case "mm": + ret.append(addLeadingZero(this.getMinutes())); + break; + case "m": + ret.append(this.getMinutes()); + break; + case "ss": + ret.append(addLeadingZero(this.getSeconds())); + break; + case "s": + ret.append(this.getSeconds()); + break; + case "tt": + ret.append((this.getHours() < 12) ? dtf.AMDesignator : dtf.PMDesignator); + break; + case "t": + ret.append(((this.getHours() < 12) ? dtf.AMDesignator : dtf.PMDesignator).charAt(0)); + break; + case "f": + ret.append(addLeadingZeros(this.getMilliseconds()).charAt(0)); + break; + case "ff": + ret.append(addLeadingZeros(this.getMilliseconds()).substr(0, 2)); + break; + case "fff": + ret.append(addLeadingZeros(this.getMilliseconds())); + break; + case "z": + hour = this.getTimezoneOffset() / 60; + ret.append(((hour <= 0) ? '+' : '-') + Math.floor(Math.abs(hour))); + break; + case "zz": + hour = this.getTimezoneOffset() / 60; + ret.append(((hour <= 0) ? '+' : '-') + addLeadingZero(Math.floor(Math.abs(hour)))); + break; + case "zzz": + hour = this.getTimezoneOffset() / 60; + ret.append(((hour <= 0) ? '+' : '-') + addLeadingZero(Math.floor(Math.abs(hour))) + + dtf.TimeSeparator + addLeadingZero(Math.abs(this.getTimezoneOffset() % 60))); + break; + } + } + return ret.toString(); +} + +Number.__typeName = 'Number'; +Number.__class = true; +Number.parseLocale = function Number$parseLocale(value) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "value", type: String} + ]); + if (e) throw e; + return Number._parse(value, Sys.CultureInfo.CurrentCulture); +} +Number.parseInvariant = function Number$parseInvariant(value) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "value", type: String} + ]); + if (e) throw e; + return Number._parse(value, Sys.CultureInfo.InvariantCulture); +} +Number._parse = function Number$_parse(value, cultureInfo) { + value = value.trim(); + + if (value.match(/^[+-]?infinity$/i)) { + return parseFloat(value); + } + if (value.match(/^0x[a-f0-9]+$/i)) { + return parseInt(value); + } + var numFormat = cultureInfo.numberFormat; + var signInfo = Number._parseNumberNegativePattern(value, numFormat, numFormat.NumberNegativePattern); + var sign = signInfo[0]; + var num = signInfo[1]; + + if ((sign === '') && (numFormat.NumberNegativePattern !== 1)) { + signInfo = Number._parseNumberNegativePattern(value, numFormat, 1); + sign = signInfo[0]; + num = signInfo[1]; + } + if (sign === '') sign = '+'; + + var exponent; + var intAndFraction; + var exponentPos = num.indexOf('e'); + if (exponentPos < 0) exponentPos = num.indexOf('E'); + if (exponentPos < 0) { + intAndFraction = num; + exponent = null; + } + else { + intAndFraction = num.substr(0, exponentPos); + exponent = num.substr(exponentPos + 1); + } + + var integer; + var fraction; + var decimalPos = intAndFraction.indexOf(numFormat.NumberDecimalSeparator); + if (decimalPos < 0) { + integer = intAndFraction; + fraction = null; + } + else { + integer = intAndFraction.substr(0, decimalPos); + fraction = intAndFraction.substr(decimalPos + numFormat.NumberDecimalSeparator.length); + } + + integer = integer.split(numFormat.NumberGroupSeparator).join(''); + var altNumGroupSeparator = numFormat.NumberGroupSeparator.replace(/\u00A0/g, " "); + if (numFormat.NumberGroupSeparator !== altNumGroupSeparator) { + integer = integer.split(altNumGroupSeparator).join(''); + } + + var p = sign + integer; + if (fraction !== null) { + p += '.' + fraction; + } + if (exponent !== null) { + var expSignInfo = Number._parseNumberNegativePattern(exponent, numFormat, 1); + if (expSignInfo[0] === '') { + expSignInfo[0] = '+'; + } + p += 'e' + expSignInfo[0] + expSignInfo[1]; + } + if (p.match(/^[+-]?\d*\.?\d*(e[+-]?\d+)?$/)) { + return parseFloat(p); + } + return Number.NaN; +} +Number._parseNumberNegativePattern = function Number$_parseNumberNegativePattern(value, numFormat, numberNegativePattern) { + var neg = numFormat.NegativeSign; + var pos = numFormat.PositiveSign; + switch (numberNegativePattern) { + case 4: + neg = ' ' + neg; + pos = ' ' + pos; + case 3: + if (value.endsWith(neg)) { + return ['-', value.substr(0, value.length - neg.length)]; + } + else if (value.endsWith(pos)) { + return ['+', value.substr(0, value.length - pos.length)]; + } + break; + case 2: + neg += ' '; + pos += ' '; + case 1: + if (value.startsWith(neg)) { + return ['-', value.substr(neg.length)]; + } + else if (value.startsWith(pos)) { + return ['+', value.substr(pos.length)]; + } + break; + case 0: + if (value.startsWith('(') && value.endsWith(')')) { + return ['-', value.substr(1, value.length - 2)]; + } + break; + } + return ['', value]; +} +Number.prototype.format = function Number$format(format) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "format", type: String} + ]); + if (e) throw e; + return this._toFormattedString(format, Sys.CultureInfo.InvariantCulture); +} +Number.prototype.localeFormat = function Number$localeFormat(format) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "format", type: String} + ]); + if (e) throw e; + return this._toFormattedString(format, Sys.CultureInfo.CurrentCulture); +} +Number.prototype._toFormattedString = function Number$_toFormattedString(format, cultureInfo) { + if (!format || (format.length === 0) || (format === 'i')) { + if (cultureInfo && (cultureInfo.name.length > 0)) { + return this.toLocaleString(); + } + else { + return this.toString(); + } + } + + var _percentPositivePattern = ["n %", "n%", "%n" ]; + var _percentNegativePattern = ["-n %", "-n%", "-%n"]; + var _numberNegativePattern = ["(n)","-n","- n","n-","n -"]; + var _currencyPositivePattern = ["$n","n$","$ n","n $"]; + var _currencyNegativePattern = ["($n)","-$n","$-n","$n-","(n$)","-n$","n-$","n$-","-n $","-$ n","n $-","$ n-","$ -n","n- $","($ n)","(n $)"]; + function zeroPad(str, count, left) { + for (var l=str.length; l < count; l++) { + str = (left ? ('0' + str) : (str + '0')); + } + return str; + } + + function expandNumber(number, precision, groupSizes, sep, decimalChar) { + + var curSize = groupSizes[0]; + var curGroupIndex = 1; + var factor = Math.pow(10, precision); + var rounded = (Math.round(number * factor) / factor); + if (!isFinite(rounded)) { + rounded = number; + } + number = rounded; + + var numberString = number.toString(); + var right = ""; + var exponent; + + + var split = numberString.split(/e/i); + numberString = split[0]; + exponent = (split.length > 1 ? parseInt(split[1]) : 0); + split = numberString.split('.'); + numberString = split[0]; + right = split.length > 1 ? split[1] : ""; + + var l; + if (exponent > 0) { + right = zeroPad(right, exponent, false); + numberString += right.slice(0, exponent); + right = right.substr(exponent); + } + else if (exponent < 0) { + exponent = -exponent; + numberString = zeroPad(numberString, exponent+1, true); + right = numberString.slice(-exponent, numberString.length) + right; + numberString = numberString.slice(0, -exponent); + } + if (precision > 0) { + if (right.length > precision) { + right = right.slice(0, precision); + } + else { + right = zeroPad(right, precision, false); + } + right = decimalChar + right; + } + else { + right = ""; + } + var stringIndex = numberString.length-1; + var ret = ""; + while (stringIndex >= 0) { + if (curSize === 0 || curSize > stringIndex) { + if (ret.length > 0) + return numberString.slice(0, stringIndex + 1) + sep + ret + right; + else + return numberString.slice(0, stringIndex + 1) + right; + } + if (ret.length > 0) + ret = numberString.slice(stringIndex - curSize + 1, stringIndex+1) + sep + ret; + else + ret = numberString.slice(stringIndex - curSize + 1, stringIndex+1); + stringIndex -= curSize; + if (curGroupIndex < groupSizes.length) { + curSize = groupSizes[curGroupIndex]; + curGroupIndex++; + } + } + return numberString.slice(0, stringIndex + 1) + sep + ret + right; + } + var nf = cultureInfo.numberFormat; + var number = Math.abs(this); + if (!format) + format = "D"; + var precision = -1; + if (format.length > 1) precision = parseInt(format.slice(1), 10); + var pattern; + switch (format.charAt(0)) { + case "d": + case "D": + pattern = 'n'; + if (precision !== -1) { + number = zeroPad(""+number, precision, true); + } + if (this < 0) number = -number; + break; + case "c": + case "C": + if (this < 0) pattern = _currencyNegativePattern[nf.CurrencyNegativePattern]; + else pattern = _currencyPositivePattern[nf.CurrencyPositivePattern]; + if (precision === -1) precision = nf.CurrencyDecimalDigits; + number = expandNumber(Math.abs(this), precision, nf.CurrencyGroupSizes, nf.CurrencyGroupSeparator, nf.CurrencyDecimalSeparator); + break; + case "n": + case "N": + if (this < 0) pattern = _numberNegativePattern[nf.NumberNegativePattern]; + else pattern = 'n'; + if (precision === -1) precision = nf.NumberDecimalDigits; + number = expandNumber(Math.abs(this), precision, nf.NumberGroupSizes, nf.NumberGroupSeparator, nf.NumberDecimalSeparator); + break; + case "p": + case "P": + if (this < 0) pattern = _percentNegativePattern[nf.PercentNegativePattern]; + else pattern = _percentPositivePattern[nf.PercentPositivePattern]; + if (precision === -1) precision = nf.PercentDecimalDigits; + number = expandNumber(Math.abs(this) * 100, precision, nf.PercentGroupSizes, nf.PercentGroupSeparator, nf.PercentDecimalSeparator); + break; + default: + throw Error.format(Sys.Res.formatBadFormatSpecifier); + } + var regex = /n|\$|-|%/g; + var ret = ""; + for (;;) { + var index = regex.lastIndex; + var ar = regex.exec(pattern); + ret += pattern.slice(index, ar ? ar.index : pattern.length); + if (!ar) + break; + switch (ar[0]) { + case "n": + ret += number; + break; + case "$": + ret += nf.CurrencySymbol; + break; + case "-": + ret += nf.NegativeSign; + break; + case "%": + ret += nf.PercentSymbol; + break; + } + } + return ret; +} + +RegExp.__typeName = 'RegExp'; +RegExp.__class = true; + +Array.__typeName = 'Array'; +Array.__class = true; +Array.add = Array.enqueue = function Array$enqueue(array, item) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "array", type: Array, elementMayBeNull: true}, + {name: "item", mayBeNull: true} + ]); + if (e) throw e; + array[array.length] = item; +} +Array.addRange = function Array$addRange(array, items) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "array", type: Array, elementMayBeNull: true}, + {name: "items", type: Array, elementMayBeNull: true} + ]); + if (e) throw e; + array.push.apply(array, items); +} +Array.clear = function Array$clear(array) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "array", type: Array, elementMayBeNull: true} + ]); + if (e) throw e; + array.length = 0; +} +Array.clone = function Array$clone(array) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "array", type: Array, elementMayBeNull: true} + ]); + if (e) throw e; + if (array.length === 1) { + return [array[0]]; + } + else { + return Array.apply(null, array); + } +} +Array.contains = function Array$contains(array, item) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "array", type: Array, elementMayBeNull: true}, + {name: "item", mayBeNull: true} + ]); + if (e) throw e; + return (Array.indexOf(array, item) >= 0); +} +Array.dequeue = function Array$dequeue(array) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "array", type: Array, elementMayBeNull: true} + ]); + if (e) throw e; + return array.shift(); +} +Array.forEach = function Array$forEach(array, method, instance) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "array", type: Array, elementMayBeNull: true}, + {name: "method", type: Function}, + {name: "instance", mayBeNull: true, optional: true} + ]); + if (e) throw e; + for (var i = 0, l = array.length; i < l; i++) { + var elt = array[i]; + if (typeof(elt) !== 'undefined') method.call(instance, elt, i, array); + } +} +Array.indexOf = function Array$indexOf(array, item, start) { + /// + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "array", type: Array, elementMayBeNull: true}, + {name: "item", mayBeNull: true, optional: true}, + {name: "start", mayBeNull: true, optional: true} + ]); + if (e) throw e; + if (typeof(item) === "undefined") return -1; + var length = array.length; + if (length !== 0) { + start = start - 0; + if (isNaN(start)) { + start = 0; + } + else { + if (isFinite(start)) { + start = start - (start % 1); + } + if (start < 0) { + start = Math.max(0, length + start); + } + } + for (var i = start; i < length; i++) { + if ((typeof(array[i]) !== "undefined") && (array[i] === item)) { + return i; + } + } + } + return -1; +} +Array.insert = function Array$insert(array, index, item) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "array", type: Array, elementMayBeNull: true}, + {name: "index", mayBeNull: true}, + {name: "item", mayBeNull: true} + ]); + if (e) throw e; + array.splice(index, 0, item); +} +Array.parse = function Array$parse(value) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "value", type: String, mayBeNull: true} + ]); + if (e) throw e; + if (!value) return []; + var v = eval(value); + if (!Array.isInstanceOfType(v)) throw Error.argument('value', Sys.Res.arrayParseBadFormat); + return v; +} +Array.remove = function Array$remove(array, item) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "array", type: Array, elementMayBeNull: true}, + {name: "item", mayBeNull: true} + ]); + if (e) throw e; + var index = Array.indexOf(array, item); + if (index >= 0) { + array.splice(index, 1); + } + return (index >= 0); +} +Array.removeAt = function Array$removeAt(array, index) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "array", type: Array, elementMayBeNull: true}, + {name: "index", mayBeNull: true} + ]); + if (e) throw e; + array.splice(index, 1); +} + +if (!window) this.window = this; +window.Type = Function; +Type.__fullyQualifiedIdentifierRegExp = new RegExp("^[^.0-9 \\s|,;:&*=+\\-()\\[\\]{}^%#@!~\\n\\r\\t\\f\\\\]([^ \\s|,;:&*=+\\-()\\[\\]{}^%#@!~\\n\\r\\t\\f\\\\]*[^. \\s|,;:&*=+\\-()\\[\\]{}^%#@!~\\n\\r\\t\\f\\\\])?$", "i"); +Type.__identifierRegExp = new RegExp("^[^.0-9 \\s|,;:&*=+\\-()\\[\\]{}^%#@!~\\n\\r\\t\\f\\\\][^. \\s|,;:&*=+\\-()\\[\\]{}^%#@!~\\n\\r\\t\\f\\\\]*$", "i"); +Type.prototype.callBaseMethod = function Type$callBaseMethod(instance, name, baseArguments) { + /// + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "instance"}, + {name: "name", type: String}, + {name: "baseArguments", type: Array, mayBeNull: true, optional: true, elementMayBeNull: true} + ]); + if (e) throw e; + var baseMethod = this.getBaseMethod(instance, name); + if (!baseMethod) throw Error.invalidOperation(String.format(Sys.Res.methodNotFound, name)); + if (!baseArguments) { + return baseMethod.apply(instance); + } + else { + return baseMethod.apply(instance, baseArguments); + } +} +Type.prototype.getBaseMethod = function Type$getBaseMethod(instance, name) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "instance"}, + {name: "name", type: String} + ]); + if (e) throw e; + if (!this.isInstanceOfType(instance)) throw Error.argumentType('instance', Object.getType(instance), this); + var baseType = this.getBaseType(); + if (baseType) { + var baseMethod = baseType.prototype[name]; + return (baseMethod instanceof Function) ? baseMethod : null; + } + return null; +} +Type.prototype.getBaseType = function Type$getBaseType() { + /// + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return (typeof(this.__baseType) === "undefined") ? null : this.__baseType; +} +Type.prototype.getInterfaces = function Type$getInterfaces() { + /// + /// + if (arguments.length !== 0) throw Error.parameterCount(); + var result = []; + var type = this; + while(type) { + var interfaces = type.__interfaces; + if (interfaces) { + for (var i = 0, l = interfaces.length; i < l; i++) { + var interfaceType = interfaces[i]; + if (!Array.contains(result, interfaceType)) { + result[result.length] = interfaceType; + } + } + } + type = type.__baseType; + } + return result; +} +Type.prototype.getName = function Type$getName() { + /// + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return (typeof(this.__typeName) === "undefined") ? "" : this.__typeName; +} +Type.prototype.implementsInterface = function Type$implementsInterface(interfaceType) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "interfaceType", type: Type} + ]); + if (e) throw e; + this.resolveInheritance(); + var interfaceName = interfaceType.getName(); + var cache = this.__interfaceCache; + if (cache) { + var cacheEntry = cache[interfaceName]; + if (typeof(cacheEntry) !== 'undefined') return cacheEntry; + } + else { + cache = this.__interfaceCache = {}; + } + var baseType = this; + while (baseType) { + var interfaces = baseType.__interfaces; + if (interfaces) { + if (Array.indexOf(interfaces, interfaceType) !== -1) { + return cache[interfaceName] = true; + } + } + baseType = baseType.__baseType; + } + return cache[interfaceName] = false; +} +Type.prototype.inheritsFrom = function Type$inheritsFrom(parentType) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "parentType", type: Type} + ]); + if (e) throw e; + this.resolveInheritance(); + var baseType = this.__baseType; + while (baseType) { + if (baseType === parentType) { + return true; + } + baseType = baseType.__baseType; + } + return false; +} +Type.prototype.initializeBase = function Type$initializeBase(instance, baseArguments) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "instance"}, + {name: "baseArguments", type: Array, mayBeNull: true, optional: true, elementMayBeNull: true} + ]); + if (e) throw e; + if (!this.isInstanceOfType(instance)) throw Error.argumentType('instance', Object.getType(instance), this); + this.resolveInheritance(); + if (this.__baseType) { + if (!baseArguments) { + this.__baseType.apply(instance); + } + else { + this.__baseType.apply(instance, baseArguments); + } + } + return instance; +} +Type.prototype.isImplementedBy = function Type$isImplementedBy(instance) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "instance", mayBeNull: true} + ]); + if (e) throw e; + if (typeof(instance) === "undefined" || instance === null) return false; + var instanceType = Object.getType(instance); + return !!(instanceType.implementsInterface && instanceType.implementsInterface(this)); +} +Type.prototype.isInstanceOfType = function Type$isInstanceOfType(instance) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "instance", mayBeNull: true} + ]); + if (e) throw e; + if (typeof(instance) === "undefined" || instance === null) return false; + if (instance instanceof this) return true; + var instanceType = Object.getType(instance); + return !!(instanceType === this) || + (instanceType.inheritsFrom && instanceType.inheritsFrom(this)) || + (instanceType.implementsInterface && instanceType.implementsInterface(this)); +} +Type.prototype.registerClass = function Type$registerClass(typeName, baseType, interfaceTypes) { + /// + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "typeName", type: String}, + {name: "baseType", type: Type, mayBeNull: true, optional: true}, + {name: "interfaceTypes", type: Type, parameterArray: true} + ]); + if (e) throw e; + if (!Type.__fullyQualifiedIdentifierRegExp.test(typeName)) throw Error.argument('typeName', Sys.Res.notATypeName); + var parsedName; + try { + parsedName = eval(typeName); + } + catch(e) { + throw Error.argument('typeName', Sys.Res.argumentTypeName); + } + if (parsedName !== this) throw Error.argument('typeName', Sys.Res.badTypeName); + if (Sys.__registeredTypes[typeName]) throw Error.invalidOperation(String.format(Sys.Res.typeRegisteredTwice, typeName)); + if ((arguments.length > 1) && (typeof(baseType) === 'undefined')) throw Error.argumentUndefined('baseType'); + if (baseType && !baseType.__class) throw Error.argument('baseType', Sys.Res.baseNotAClass); + this.prototype.constructor = this; + this.__typeName = typeName; + this.__class = true; + if (baseType) { + this.__baseType = baseType; + this.__basePrototypePending = true; + } + Sys.__upperCaseTypes[typeName.toUpperCase()] = this; + if (interfaceTypes) { + this.__interfaces = []; + this.resolveInheritance(); + for (var i = 2, l = arguments.length; i < l; i++) { + var interfaceType = arguments[i]; + if (!interfaceType.__interface) throw Error.argument('interfaceTypes[' + (i - 2) + ']', Sys.Res.notAnInterface); + for (var methodName in interfaceType.prototype) { + var method = interfaceType.prototype[methodName]; + if (!this.prototype[methodName]) { + this.prototype[methodName] = method; + } + } + this.__interfaces.push(interfaceType); + } + } + Sys.__registeredTypes[typeName] = true; + return this; +} +Type.prototype.registerInterface = function Type$registerInterface(typeName) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "typeName", type: String} + ]); + if (e) throw e; + if (!Type.__fullyQualifiedIdentifierRegExp.test(typeName)) throw Error.argument('typeName', Sys.Res.notATypeName); + var parsedName; + try { + parsedName = eval(typeName); + } + catch(e) { + throw Error.argument('typeName', Sys.Res.argumentTypeName); + } + if (parsedName !== this) throw Error.argument('typeName', Sys.Res.badTypeName); + if (Sys.__registeredTypes[typeName]) throw Error.invalidOperation(String.format(Sys.Res.typeRegisteredTwice, typeName)); + Sys.__upperCaseTypes[typeName.toUpperCase()] = this; + this.prototype.constructor = this; + this.__typeName = typeName; + this.__interface = true; + Sys.__registeredTypes[typeName] = true; + return this; +} +Type.prototype.resolveInheritance = function Type$resolveInheritance() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (this.__basePrototypePending) { + var baseType = this.__baseType; + baseType.resolveInheritance(); + for (var memberName in baseType.prototype) { + var memberValue = baseType.prototype[memberName]; + if (!this.prototype[memberName]) { + this.prototype[memberName] = memberValue; + } + } + delete this.__basePrototypePending; + } +} +Type.getRootNamespaces = function Type$getRootNamespaces() { + /// + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return Array.clone(Sys.__rootNamespaces); +} +Type.isClass = function Type$isClass(type) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "type", mayBeNull: true} + ]); + if (e) throw e; + if ((typeof(type) === 'undefined') || (type === null)) return false; + return !!type.__class; +} +Type.isInterface = function Type$isInterface(type) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "type", mayBeNull: true} + ]); + if (e) throw e; + if ((typeof(type) === 'undefined') || (type === null)) return false; + return !!type.__interface; +} +Type.isNamespace = function Type$isNamespace(object) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "object", mayBeNull: true} + ]); + if (e) throw e; + if ((typeof(object) === 'undefined') || (object === null)) return false; + return !!object.__namespace; +} +Type.parse = function Type$parse(typeName, ns) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "typeName", type: String, mayBeNull: true}, + {name: "ns", mayBeNull: true, optional: true} + ]); + if (e) throw e; + var fn; + if (ns) { + fn = Sys.__upperCaseTypes[ns.getName().toUpperCase() + '.' + typeName.toUpperCase()]; + return fn || null; + } + if (!typeName) return null; + if (!Type.__htClasses) { + Type.__htClasses = {}; + } + fn = Type.__htClasses[typeName]; + if (!fn) { + fn = eval(typeName); + if (typeof(fn) !== 'function') throw Error.argument('typeName', Sys.Res.notATypeName); + Type.__htClasses[typeName] = fn; + } + return fn; +} +Type.registerNamespace = function Type$registerNamespace(namespacePath) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "namespacePath", type: String} + ]); + if (e) throw e; + if (!Type.__fullyQualifiedIdentifierRegExp.test(namespacePath)) throw Error.argument('namespacePath', Sys.Res.invalidNameSpace); + var rootObject = window; + var namespaceParts = namespacePath.split('.'); + for (var i = 0; i < namespaceParts.length; i++) { + var currentPart = namespaceParts[i]; + var ns = rootObject[currentPart]; + if (ns && !ns.__namespace) { + throw Error.invalidOperation(String.format(Sys.Res.namespaceContainsObject, namespaceParts.splice(0, i + 1).join('.'))); + } + if (!ns) { + ns = rootObject[currentPart] = { + __namespace: true, + __typeName: namespaceParts.slice(0, i + 1).join('.') + }; + if (i === 0) { + Sys.__rootNamespaces[Sys.__rootNamespaces.length] = ns; + } + var parsedName; + try { + parsedName = eval(ns.__typeName); + } + catch(e) { + parsedName = null; + } + if (parsedName !== ns) { + delete rootObject[currentPart]; + throw Error.argument('namespacePath', Sys.Res.invalidNameSpace); + } + ns.getName = function ns$getName() {return this.__typeName;} + } + rootObject = ns; + } +} +window.Sys = { + __namespace: true, + __typeName: "Sys", + getName: function() {return "Sys";}, + __upperCaseTypes: {} +}; +Sys.__rootNamespaces = [Sys]; +Sys.__registeredTypes = {}; + +Sys.IDisposable = function Sys$IDisposable() { + throw Error.notImplemented(); +} + function Sys$IDisposable$dispose() { + throw Error.notImplemented(); + } +Sys.IDisposable.prototype = { + dispose: Sys$IDisposable$dispose +} +Sys.IDisposable.registerInterface('Sys.IDisposable'); + +Sys.StringBuilder = function Sys$StringBuilder(initialText) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "initialText", mayBeNull: true, optional: true} + ]); + if (e) throw e; + this._parts = (typeof(initialText) !== 'undefined' && initialText !== null && initialText !== '') ? + [initialText.toString()] : []; + this._value = {}; + this._len = 0; +} + function Sys$StringBuilder$append(text) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "text", mayBeNull: true} + ]); + if (e) throw e; + this._parts[this._parts.length] = text; + } + function Sys$StringBuilder$appendLine(text) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "text", mayBeNull: true, optional: true} + ]); + if (e) throw e; + this._parts[this._parts.length] = + ((typeof(text) === 'undefined') || (text === null) || (text === '')) ? + '\r\n' : text + '\r\n'; + } + function Sys$StringBuilder$clear() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + this._parts = []; + this._value = {}; + this._len = 0; + } + function Sys$StringBuilder$isEmpty() { + /// + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (this._parts.length === 0) return true; + return this.toString() === ''; + } + function Sys$StringBuilder$toString(separator) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "separator", type: String, mayBeNull: true, optional: true} + ]); + if (e) throw e; + separator = separator || ''; + var parts = this._parts; + if (this._len !== parts.length) { + this._value = {}; + this._len = parts.length; + } + var val = this._value; + if (typeof(val[separator]) === 'undefined') { + if (separator !== '') { + for (var i = 0; i < parts.length;) { + if ((typeof(parts[i]) === 'undefined') || (parts[i] === '') || (parts[i] === null)) { + parts.splice(i, 1); + } + else { + i++; + } + } + } + val[separator] = this._parts.join(separator); + } + return val[separator]; + } +Sys.StringBuilder.prototype = { + append: Sys$StringBuilder$append, + appendLine: Sys$StringBuilder$appendLine, + clear: Sys$StringBuilder$clear, + isEmpty: Sys$StringBuilder$isEmpty, + toString: Sys$StringBuilder$toString +} +Sys.StringBuilder.registerClass('Sys.StringBuilder'); + +if (!window.XMLHttpRequest) { + window.XMLHttpRequest = function window$XMLHttpRequest() { + var progIDs = [ 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP' ]; + for (var i = 0, l = progIDs.length; i < l; i++) { + try { + return new ActiveXObject(progIDs[i]); + } + catch (ex) { + } + } + return null; + } +} + +Sys.Browser = {}; +Sys.Browser.InternetExplorer = {}; +Sys.Browser.Firefox = {}; +Sys.Browser.Safari = {}; +Sys.Browser.Opera = {}; +Sys.Browser.agent = null; +Sys.Browser.hasDebuggerStatement = false; +Sys.Browser.name = navigator.appName; +Sys.Browser.version = parseFloat(navigator.appVersion); +Sys.Browser.documentMode = 0; +if (navigator.userAgent.indexOf(' MSIE ') > -1) { + Sys.Browser.agent = Sys.Browser.InternetExplorer; + Sys.Browser.version = parseFloat(navigator.userAgent.match(/MSIE (\d+\.\d+)/)[1]); + if (Sys.Browser.version >= 8) { + if (document.documentMode >= 7) { + Sys.Browser.documentMode = document.documentMode; + } + } + Sys.Browser.hasDebuggerStatement = true; +} +else if (navigator.userAgent.indexOf(' Firefox/') > -1) { + Sys.Browser.agent = Sys.Browser.Firefox; + Sys.Browser.version = parseFloat(navigator.userAgent.match(/ Firefox\/(\d+\.\d+)/)[1]); + Sys.Browser.name = 'Firefox'; + Sys.Browser.hasDebuggerStatement = true; +} +else if (navigator.userAgent.indexOf(' AppleWebKit/') > -1) { + Sys.Browser.agent = Sys.Browser.Safari; + Sys.Browser.version = parseFloat(navigator.userAgent.match(/ AppleWebKit\/(\d+(\.\d+)?)/)[1]); + Sys.Browser.name = 'Safari'; +} +else if (navigator.userAgent.indexOf('Opera/') > -1) { + Sys.Browser.agent = Sys.Browser.Opera; +} +Type.registerNamespace('Sys.UI'); + +Sys._Debug = function Sys$_Debug() { + /// + /// + if (arguments.length !== 0) throw Error.parameterCount(); +} + function Sys$_Debug$_appendConsole(text) { + if ((typeof(Debug) !== 'undefined') && Debug.writeln) { + Debug.writeln(text); + } + if (window.console && window.console.log) { + window.console.log(text); + } + if (window.opera) { + window.opera.postError(text); + } + if (window.debugService) { + window.debugService.trace(text); + } + } + function Sys$_Debug$_appendTrace(text) { + var traceElement = document.getElementById('TraceConsole'); + if (traceElement && (traceElement.tagName.toUpperCase() === 'TEXTAREA')) { + traceElement.value += text + '\n'; + } + } + function Sys$_Debug$assert(condition, message, displayCaller) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "condition", type: Boolean}, + {name: "message", type: String, mayBeNull: true, optional: true}, + {name: "displayCaller", type: Boolean, optional: true} + ]); + if (e) throw e; + if (!condition) { + message = (displayCaller && this.assert.caller) ? + String.format(Sys.Res.assertFailedCaller, message, this.assert.caller) : + String.format(Sys.Res.assertFailed, message); + if (confirm(String.format(Sys.Res.breakIntoDebugger, message))) { + this.fail(message); + } + } + } + function Sys$_Debug$clearTrace() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + var traceElement = document.getElementById('TraceConsole'); + if (traceElement && (traceElement.tagName.toUpperCase() === 'TEXTAREA')) { + traceElement.value = ''; + } + } + function Sys$_Debug$fail(message) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "message", type: String, mayBeNull: true} + ]); + if (e) throw e; + this._appendConsole(message); + if (Sys.Browser.hasDebuggerStatement) { + eval('debugger'); + } + } + function Sys$_Debug$trace(text) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "text"} + ]); + if (e) throw e; + this._appendConsole(text); + this._appendTrace(text); + } + function Sys$_Debug$traceDump(object, name) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "object", mayBeNull: true}, + {name: "name", type: String, mayBeNull: true, optional: true} + ]); + if (e) throw e; + var text = this._traceDump(object, name, true); + } + function Sys$_Debug$_traceDump(object, name, recursive, indentationPadding, loopArray) { + name = name? name : 'traceDump'; + indentationPadding = indentationPadding? indentationPadding : ''; + if (object === null) { + this.trace(indentationPadding + name + ': null'); + return; + } + switch(typeof(object)) { + case 'undefined': + this.trace(indentationPadding + name + ': Undefined'); + break; + case 'number': case 'string': case 'boolean': + this.trace(indentationPadding + name + ': ' + object); + break; + default: + if (Date.isInstanceOfType(object) || RegExp.isInstanceOfType(object)) { + this.trace(indentationPadding + name + ': ' + object.toString()); + break; + } + if (!loopArray) { + loopArray = []; + } + else if (Array.contains(loopArray, object)) { + this.trace(indentationPadding + name + ': ...'); + return; + } + Array.add(loopArray, object); + if ((object == window) || (object === document) || + (window.HTMLElement && (object instanceof HTMLElement)) || + (typeof(object.nodeName) === 'string')) { + var tag = object.tagName? object.tagName : 'DomElement'; + if (object.id) { + tag += ' - ' + object.id; + } + this.trace(indentationPadding + name + ' {' + tag + '}'); + } + else { + var typeName = Object.getTypeName(object); + this.trace(indentationPadding + name + (typeof(typeName) === 'string' ? ' {' + typeName + '}' : '')); + if ((indentationPadding === '') || recursive) { + indentationPadding += " "; + var i, length, properties, p, v; + if (Array.isInstanceOfType(object)) { + length = object.length; + for (i = 0; i < length; i++) { + this._traceDump(object[i], '[' + i + ']', recursive, indentationPadding, loopArray); + } + } + else { + for (p in object) { + v = object[p]; + if (!Function.isInstanceOfType(v)) { + this._traceDump(v, p, recursive, indentationPadding, loopArray); + } + } + } + } + } + Array.remove(loopArray, object); + } + } +Sys._Debug.prototype = { + _appendConsole: Sys$_Debug$_appendConsole, + _appendTrace: Sys$_Debug$_appendTrace, + assert: Sys$_Debug$assert, + clearTrace: Sys$_Debug$clearTrace, + fail: Sys$_Debug$fail, + trace: Sys$_Debug$trace, + traceDump: Sys$_Debug$traceDump, + _traceDump: Sys$_Debug$_traceDump +} +Sys._Debug.registerClass('Sys._Debug'); +Sys.Debug = new Sys._Debug(); + Sys.Debug.isDebug = true; + +function Sys$Enum$parse(value, ignoreCase) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "value", type: String}, + {name: "ignoreCase", type: Boolean, optional: true} + ]); + if (e) throw e; + var values, parsed, val; + if (ignoreCase) { + values = this.__lowerCaseValues; + if (!values) { + this.__lowerCaseValues = values = {}; + var prototype = this.prototype; + for (var name in prototype) { + values[name.toLowerCase()] = prototype[name]; + } + } + } + else { + values = this.prototype; + } + if (!this.__flags) { + val = (ignoreCase ? value.toLowerCase() : value); + parsed = values[val.trim()]; + if (typeof(parsed) !== 'number') throw Error.argument('value', String.format(Sys.Res.enumInvalidValue, value, this.__typeName)); + return parsed; + } + else { + var parts = (ignoreCase ? value.toLowerCase() : value).split(','); + var v = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var part = parts[i].trim(); + parsed = values[part]; + if (typeof(parsed) !== 'number') throw Error.argument('value', String.format(Sys.Res.enumInvalidValue, value.split(',')[i].trim(), this.__typeName)); + v |= parsed; + } + return v; + } +} +function Sys$Enum$toString(value) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "value", mayBeNull: true, optional: true} + ]); + if (e) throw e; + if ((typeof(value) === 'undefined') || (value === null)) return this.__string; + if ((typeof(value) != 'number') || ((value % 1) !== 0)) throw Error.argumentType('value', Object.getType(value), this); + var values = this.prototype; + var i; + if (!this.__flags || (value === 0)) { + for (i in values) { + if (values[i] === value) { + return i; + } + } + } + else { + var sorted = this.__sortedValues; + if (!sorted) { + sorted = []; + for (i in values) { + sorted[sorted.length] = {key: i, value: values[i]}; + } + sorted.sort(function(a, b) { + return a.value - b.value; + }); + this.__sortedValues = sorted; + } + var parts = []; + var v = value; + for (i = sorted.length - 1; i >= 0; i--) { + var kvp = sorted[i]; + var vali = kvp.value; + if (vali === 0) continue; + if ((vali & value) === vali) { + parts[parts.length] = kvp.key; + v -= vali; + if (v === 0) break; + } + } + if (parts.length && v === 0) return parts.reverse().join(', '); + } + throw Error.argumentOutOfRange('value', value, String.format(Sys.Res.enumInvalidValue, value, this.__typeName)); +} +Type.prototype.registerEnum = function Type$registerEnum(name, flags) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "name", type: String}, + {name: "flags", type: Boolean, optional: true} + ]); + if (e) throw e; + if (!Type.__fullyQualifiedIdentifierRegExp.test(name)) throw Error.argument('name', Sys.Res.notATypeName); + var parsedName; + try { + parsedName = eval(name); + } + catch(e) { + throw Error.argument('name', Sys.Res.argumentTypeName); + } + if (parsedName !== this) throw Error.argument('name', Sys.Res.badTypeName); + if (Sys.__registeredTypes[name]) throw Error.invalidOperation(String.format(Sys.Res.typeRegisteredTwice, name)); + for (var i in this.prototype) { + var val = this.prototype[i]; + if (!Type.__identifierRegExp.test(i)) throw Error.invalidOperation(String.format(Sys.Res.enumInvalidValueName, i)); + if (typeof(val) !== 'number' || (val % 1) !== 0) throw Error.invalidOperation(Sys.Res.enumValueNotInteger); + if (typeof(this[i]) !== 'undefined') throw Error.invalidOperation(String.format(Sys.Res.enumReservedName, i)); + } + Sys.__upperCaseTypes[name.toUpperCase()] = this; + for (var i in this.prototype) { + this[i] = this.prototype[i]; + } + this.__typeName = name; + this.parse = Sys$Enum$parse; + this.__string = this.toString(); + this.toString = Sys$Enum$toString; + this.__flags = flags; + this.__enum = true; + Sys.__registeredTypes[name] = true; +} +Type.isEnum = function Type$isEnum(type) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "type", mayBeNull: true} + ]); + if (e) throw e; + if ((typeof(type) === 'undefined') || (type === null)) return false; + return !!type.__enum; +} +Type.isFlags = function Type$isFlags(type) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "type", mayBeNull: true} + ]); + if (e) throw e; + if ((typeof(type) === 'undefined') || (type === null)) return false; + return !!type.__flags; +} + +Sys.EventHandlerList = function Sys$EventHandlerList() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + this._list = {}; +} + function Sys$EventHandlerList$addHandler(id, handler) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "id", type: String}, + {name: "handler", type: Function} + ]); + if (e) throw e; + Array.add(this._getEvent(id, true), handler); + } + function Sys$EventHandlerList$removeHandler(id, handler) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "id", type: String}, + {name: "handler", type: Function} + ]); + if (e) throw e; + var evt = this._getEvent(id); + if (!evt) return; + Array.remove(evt, handler); + } + function Sys$EventHandlerList$getHandler(id) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "id", type: String} + ]); + if (e) throw e; + var evt = this._getEvent(id); + if (!evt || (evt.length === 0)) return null; + evt = Array.clone(evt); + return function(source, args) { + for (var i = 0, l = evt.length; i < l; i++) { + evt[i](source, args); + } + }; + } + function Sys$EventHandlerList$_getEvent(id, create) { + if (!this._list[id]) { + if (!create) return null; + this._list[id] = []; + } + return this._list[id]; + } +Sys.EventHandlerList.prototype = { + addHandler: Sys$EventHandlerList$addHandler, + removeHandler: Sys$EventHandlerList$removeHandler, + getHandler: Sys$EventHandlerList$getHandler, + _getEvent: Sys$EventHandlerList$_getEvent +} +Sys.EventHandlerList.registerClass('Sys.EventHandlerList'); + +Sys.EventArgs = function Sys$EventArgs() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); +} +Sys.EventArgs.registerClass('Sys.EventArgs'); +Sys.EventArgs.Empty = new Sys.EventArgs(); + +Sys.CancelEventArgs = function Sys$CancelEventArgs() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + Sys.CancelEventArgs.initializeBase(this); + this._cancel = false; +} + function Sys$CancelEventArgs$get_cancel() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._cancel; + } + function Sys$CancelEventArgs$set_cancel(value) { + var e = Function._validateParams(arguments, [{name: "value", type: Boolean}]); + if (e) throw e; + this._cancel = value; + } +Sys.CancelEventArgs.prototype = { + get_cancel: Sys$CancelEventArgs$get_cancel, + set_cancel: Sys$CancelEventArgs$set_cancel +} +Sys.CancelEventArgs.registerClass('Sys.CancelEventArgs', Sys.EventArgs); + +Sys.INotifyPropertyChange = function Sys$INotifyPropertyChange() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + throw Error.notImplemented(); +} + function Sys$INotifyPropertyChange$add_propertyChanged(handler) { + /// + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + throw Error.notImplemented(); + } + function Sys$INotifyPropertyChange$remove_propertyChanged(handler) { + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + throw Error.notImplemented(); + } +Sys.INotifyPropertyChange.prototype = { + add_propertyChanged: Sys$INotifyPropertyChange$add_propertyChanged, + remove_propertyChanged: Sys$INotifyPropertyChange$remove_propertyChanged +} +Sys.INotifyPropertyChange.registerInterface('Sys.INotifyPropertyChange'); + +Sys.PropertyChangedEventArgs = function Sys$PropertyChangedEventArgs(propertyName) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "propertyName", type: String} + ]); + if (e) throw e; + Sys.PropertyChangedEventArgs.initializeBase(this); + this._propertyName = propertyName; +} + + function Sys$PropertyChangedEventArgs$get_propertyName() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._propertyName; + } +Sys.PropertyChangedEventArgs.prototype = { + get_propertyName: Sys$PropertyChangedEventArgs$get_propertyName +} +Sys.PropertyChangedEventArgs.registerClass('Sys.PropertyChangedEventArgs', Sys.EventArgs); + +Sys.INotifyDisposing = function Sys$INotifyDisposing() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + throw Error.notImplemented(); +} + function Sys$INotifyDisposing$add_disposing(handler) { + /// + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + throw Error.notImplemented(); + } + function Sys$INotifyDisposing$remove_disposing(handler) { + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + throw Error.notImplemented(); + } +Sys.INotifyDisposing.prototype = { + add_disposing: Sys$INotifyDisposing$add_disposing, + remove_disposing: Sys$INotifyDisposing$remove_disposing +} +Sys.INotifyDisposing.registerInterface("Sys.INotifyDisposing"); + +Sys.Component = function Sys$Component() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (Sys.Application) Sys.Application.registerDisposableObject(this); +} + function Sys$Component$get_events() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (!this._events) { + this._events = new Sys.EventHandlerList(); + } + return this._events; + } + function Sys$Component$get_id() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._id; + } + function Sys$Component$set_id(value) { + var e = Function._validateParams(arguments, [{name: "value", type: String}]); + if (e) throw e; + if (this._idSet) throw Error.invalidOperation(Sys.Res.componentCantSetIdTwice); + this._idSet = true; + var oldId = this.get_id(); + if (oldId && Sys.Application.findComponent(oldId)) throw Error.invalidOperation(Sys.Res.componentCantSetIdAfterAddedToApp); + this._id = value; + } + function Sys$Component$get_isInitialized() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._initialized; + } + function Sys$Component$get_isUpdating() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._updating; + } + function Sys$Component$add_disposing(handler) { + /// + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + this.get_events().addHandler("disposing", handler); + } + function Sys$Component$remove_disposing(handler) { + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + this.get_events().removeHandler("disposing", handler); + } + function Sys$Component$add_propertyChanged(handler) { + /// + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + this.get_events().addHandler("propertyChanged", handler); + } + function Sys$Component$remove_propertyChanged(handler) { + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + this.get_events().removeHandler("propertyChanged", handler); + } + function Sys$Component$beginUpdate() { + this._updating = true; + } + function Sys$Component$dispose() { + if (this._events) { + var handler = this._events.getHandler("disposing"); + if (handler) { + handler(this, Sys.EventArgs.Empty); + } + } + delete this._events; + Sys.Application.unregisterDisposableObject(this); + Sys.Application.removeComponent(this); + } + function Sys$Component$endUpdate() { + this._updating = false; + if (!this._initialized) this.initialize(); + this.updated(); + } + function Sys$Component$initialize() { + this._initialized = true; + } + function Sys$Component$raisePropertyChanged(propertyName) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "propertyName", type: String} + ]); + if (e) throw e; + if (!this._events) return; + var handler = this._events.getHandler("propertyChanged"); + if (handler) { + handler(this, new Sys.PropertyChangedEventArgs(propertyName)); + } + } + function Sys$Component$updated() { + } +Sys.Component.prototype = { + _id: null, + _idSet: false, + _initialized: false, + _updating: false, + get_events: Sys$Component$get_events, + get_id: Sys$Component$get_id, + set_id: Sys$Component$set_id, + get_isInitialized: Sys$Component$get_isInitialized, + get_isUpdating: Sys$Component$get_isUpdating, + add_disposing: Sys$Component$add_disposing, + remove_disposing: Sys$Component$remove_disposing, + add_propertyChanged: Sys$Component$add_propertyChanged, + remove_propertyChanged: Sys$Component$remove_propertyChanged, + beginUpdate: Sys$Component$beginUpdate, + dispose: Sys$Component$dispose, + endUpdate: Sys$Component$endUpdate, + initialize: Sys$Component$initialize, + raisePropertyChanged: Sys$Component$raisePropertyChanged, + updated: Sys$Component$updated +} +Sys.Component.registerClass('Sys.Component', null, Sys.IDisposable, Sys.INotifyPropertyChange, Sys.INotifyDisposing); +function Sys$Component$_setProperties(target, properties) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "target"}, + {name: "properties"} + ]); + if (e) throw e; + var current; + var targetType = Object.getType(target); + var isObject = (targetType === Object) || (targetType === Sys.UI.DomElement); + var isComponent = Sys.Component.isInstanceOfType(target) && !target.get_isUpdating(); + if (isComponent) target.beginUpdate(); + for (var name in properties) { + var val = properties[name]; + var getter = isObject ? null : target["get_" + name]; + if (isObject || typeof(getter) !== 'function') { + var targetVal = target[name]; + if (!isObject && typeof(targetVal) === 'undefined') throw Error.invalidOperation(String.format(Sys.Res.propertyUndefined, name)); + if (!val || (typeof(val) !== 'object') || (isObject && !targetVal)) { + target[name] = val; + } + else { + Sys$Component$_setProperties(targetVal, val); + } + } + else { + var setter = target["set_" + name]; + if (typeof(setter) === 'function') { + setter.apply(target, [val]); + } + else if (val instanceof Array) { + current = getter.apply(target); + if (!(current instanceof Array)) throw new Error.invalidOperation(String.format(Sys.Res.propertyNotAnArray, name)); + for (var i = 0, j = current.length, l= val.length; i < l; i++, j++) { + current[j] = val[i]; + } + } + else if ((typeof(val) === 'object') && (Object.getType(val) === Object)) { + current = getter.apply(target); + if ((typeof(current) === 'undefined') || (current === null)) throw new Error.invalidOperation(String.format(Sys.Res.propertyNullOrUndefined, name)); + Sys$Component$_setProperties(current, val); + } + else { + throw new Error.invalidOperation(String.format(Sys.Res.propertyNotWritable, name)); + } + } + } + if (isComponent) target.endUpdate(); +} +function Sys$Component$_setReferences(component, references) { + for (var name in references) { + var setter = component["set_" + name]; + var reference = $find(references[name]); + if (typeof(setter) !== 'function') throw new Error.invalidOperation(String.format(Sys.Res.propertyNotWritable, name)); + if (!reference) throw Error.invalidOperation(String.format(Sys.Res.referenceNotFound, references[name])); + setter.apply(component, [reference]); + } +} +var $create = Sys.Component.create = function Sys$Component$create(type, properties, events, references, element) { + /// + /// + /// + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "type", type: Type}, + {name: "properties", mayBeNull: true, optional: true}, + {name: "events", mayBeNull: true, optional: true}, + {name: "references", mayBeNull: true, optional: true}, + {name: "element", mayBeNull: true, domElement: true, optional: true} + ]); + if (e) throw e; + if (!type.inheritsFrom(Sys.Component)) { + throw Error.argument('type', String.format(Sys.Res.createNotComponent, type.getName())); + } + if (type.inheritsFrom(Sys.UI.Behavior) || type.inheritsFrom(Sys.UI.Control)) { + if (!element) throw Error.argument('element', Sys.Res.createNoDom); + } + else if (element) throw Error.argument('element', Sys.Res.createComponentOnDom); + var component = (element ? new type(element): new type()); + var app = Sys.Application; + var creatingComponents = app.get_isCreatingComponents(); + component.beginUpdate(); + if (properties) { + Sys$Component$_setProperties(component, properties); + } + if (events) { + for (var name in events) { + if (!(component["add_" + name] instanceof Function)) throw new Error.invalidOperation(String.format(Sys.Res.undefinedEvent, name)); + if (!(events[name] instanceof Function)) throw new Error.invalidOperation(Sys.Res.eventHandlerNotFunction); + component["add_" + name](events[name]); + } + } + if (component.get_id()) { + app.addComponent(component); + } + if (creatingComponents) { + app._createdComponents[app._createdComponents.length] = component; + if (references) { + app._addComponentToSecondPass(component, references); + } + else { + component.endUpdate(); + } + } + else { + if (references) { + Sys$Component$_setReferences(component, references); + } + component.endUpdate(); + } + return component; +} + +Sys.UI.MouseButton = function Sys$UI$MouseButton() { + /// + /// + /// + /// + if (arguments.length !== 0) throw Error.parameterCount(); + throw Error.notImplemented(); +} +Sys.UI.MouseButton.prototype = { + leftButton: 0, + middleButton: 1, + rightButton: 2 +} +Sys.UI.MouseButton.registerEnum("Sys.UI.MouseButton"); + +Sys.UI.Key = function Sys$UI$Key() { + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + if (arguments.length !== 0) throw Error.parameterCount(); + throw Error.notImplemented(); +} +Sys.UI.Key.prototype = { + backspace: 8, + tab: 9, + enter: 13, + esc: 27, + space: 32, + pageUp: 33, + pageDown: 34, + end: 35, + home: 36, + left: 37, + up: 38, + right: 39, + down: 40, + del: 127 +} +Sys.UI.Key.registerEnum("Sys.UI.Key"); + +Sys.UI.Point = function Sys$UI$Point(x, y) { + /// + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "x", type: Number, integer: true}, + {name: "y", type: Number, integer: true} + ]); + if (e) throw e; + this.x = x; + this.y = y; +} +Sys.UI.Point.registerClass('Sys.UI.Point'); + +Sys.UI.Bounds = function Sys$UI$Bounds(x, y, width, height) { + /// + /// + /// + /// + /// + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "x", type: Number, integer: true}, + {name: "y", type: Number, integer: true}, + {name: "height", type: Number, integer: true}, + {name: "width", type: Number, integer: true} + ]); + if (e) throw e; + this.x = x; + this.y = y; + this.height = height; + this.width = width; +} +Sys.UI.Bounds.registerClass('Sys.UI.Bounds'); + +Sys.UI.DomEvent = function Sys$UI$DomEvent(eventObject) { + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "eventObject"} + ]); + if (e) throw e; + var e = eventObject; + var etype = this.type = e.type.toLowerCase(); + this.rawEvent = e; + this.altKey = e.altKey; + if (typeof(e.button) !== 'undefined') { + this.button = (typeof(e.which) !== 'undefined') ? e.button : + (e.button === 4) ? Sys.UI.MouseButton.middleButton : + (e.button === 2) ? Sys.UI.MouseButton.rightButton : + Sys.UI.MouseButton.leftButton; + } + if (etype === 'keypress') { + this.charCode = e.charCode || e.keyCode; + } + else if (e.keyCode && (e.keyCode === 46)) { + this.keyCode = 127; + } + else { + this.keyCode = e.keyCode; + } + this.clientX = e.clientX; + this.clientY = e.clientY; + this.ctrlKey = e.ctrlKey; + this.target = e.target ? e.target : e.srcElement; + if (!etype.startsWith('key')) { + if ((typeof(e.offsetX) !== 'undefined') && (typeof(e.offsetY) !== 'undefined')) { + this.offsetX = e.offsetX; + this.offsetY = e.offsetY; + } + else if (this.target && (this.target.nodeType !== 3) && (typeof(e.clientX) === 'number')) { + var loc = Sys.UI.DomElement.getLocation(this.target); + var w = Sys.UI.DomElement._getWindow(this.target); + this.offsetX = (w.pageXOffset || 0) + e.clientX - loc.x; + this.offsetY = (w.pageYOffset || 0) + e.clientY - loc.y; + } + } + this.screenX = e.screenX; + this.screenY = e.screenY; + this.shiftKey = e.shiftKey; +} + function Sys$UI$DomEvent$preventDefault() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (this.rawEvent.preventDefault) { + this.rawEvent.preventDefault(); + } + else if (window.event) { + this.rawEvent.returnValue = false; + } + } + function Sys$UI$DomEvent$stopPropagation() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (this.rawEvent.stopPropagation) { + this.rawEvent.stopPropagation(); + } + else if (window.event) { + this.rawEvent.cancelBubble = true; + } + } +Sys.UI.DomEvent.prototype = { + preventDefault: Sys$UI$DomEvent$preventDefault, + stopPropagation: Sys$UI$DomEvent$stopPropagation +} +Sys.UI.DomEvent.registerClass('Sys.UI.DomEvent'); +var $addHandler = Sys.UI.DomEvent.addHandler = function Sys$UI$DomEvent$addHandler(element, eventName, handler) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element"}, + {name: "eventName", type: String}, + {name: "handler", type: Function} + ]); + if (e) throw e; + Sys.UI.DomEvent._ensureDomNode(element); + if (eventName === "error") throw Error.invalidOperation(Sys.Res.addHandlerCantBeUsedForError); + if (!element._events) { + element._events = {}; + } + var eventCache = element._events[eventName]; + if (!eventCache) { + element._events[eventName] = eventCache = []; + } + var browserHandler; + if (element.addEventListener) { + browserHandler = function(e) { + return handler.call(element, new Sys.UI.DomEvent(e)); + } + element.addEventListener(eventName, browserHandler, false); + } + else if (element.attachEvent) { + browserHandler = function() { + var e = {}; + try {e = Sys.UI.DomElement._getWindow(element).event} catch(ex) {} + return handler.call(element, new Sys.UI.DomEvent(e)); + } + element.attachEvent('on' + eventName, browserHandler); + } + eventCache[eventCache.length] = {handler: handler, browserHandler: browserHandler}; +} +var $addHandlers = Sys.UI.DomEvent.addHandlers = function Sys$UI$DomEvent$addHandlers(element, events, handlerOwner) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element"}, + {name: "events", type: Object}, + {name: "handlerOwner", optional: true} + ]); + if (e) throw e; + Sys.UI.DomEvent._ensureDomNode(element); + for (var name in events) { + var handler = events[name]; + if (typeof(handler) !== 'function') throw Error.invalidOperation(Sys.Res.cantAddNonFunctionhandler); + if (handlerOwner) { + handler = Function.createDelegate(handlerOwner, handler); + } + $addHandler(element, name, handler); + } +} +var $clearHandlers = Sys.UI.DomEvent.clearHandlers = function Sys$UI$DomEvent$clearHandlers(element) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element"} + ]); + if (e) throw e; + Sys.UI.DomEvent._ensureDomNode(element); + if (element._events) { + var cache = element._events; + for (var name in cache) { + var handlers = cache[name]; + for (var i = handlers.length - 1; i >= 0; i--) { + $removeHandler(element, name, handlers[i].handler); + } + } + element._events = null; + } +} +var $removeHandler = Sys.UI.DomEvent.removeHandler = function Sys$UI$DomEvent$removeHandler(element, eventName, handler) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element"}, + {name: "eventName", type: String}, + {name: "handler", type: Function} + ]); + if (e) throw e; + Sys.UI.DomEvent._ensureDomNode(element); + var browserHandler = null; + if ((typeof(element._events) !== 'object') || (element._events == null)) throw Error.invalidOperation(Sys.Res.eventHandlerInvalid); + var cache = element._events[eventName]; + if (!(cache instanceof Array)) throw Error.invalidOperation(Sys.Res.eventHandlerInvalid); + for (var i = 0, l = cache.length; i < l; i++) { + if (cache[i].handler === handler) { + browserHandler = cache[i].browserHandler; + break; + } + } + if (typeof(browserHandler) !== 'function') throw Error.invalidOperation(Sys.Res.eventHandlerInvalid); + if (element.removeEventListener) { + element.removeEventListener(eventName, browserHandler, false); + } + else if (element.detachEvent) { + element.detachEvent('on' + eventName, browserHandler); + } + cache.splice(i, 1); +} +Sys.UI.DomEvent._ensureDomNode = function Sys$UI$DomEvent$_ensureDomNode(element) { + if (element.tagName && (element.tagName.toUpperCase() === "SCRIPT")) return; + + var doc = element.ownerDocument || element.document || element; + if ((typeof(element.document) !== 'object') && (element != doc) && (typeof(element.nodeType) !== 'number')) { + throw Error.argument("element", Sys.Res.argumentDomNode); + } +} + +Sys.UI.DomElement = function Sys$UI$DomElement() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + throw Error.notImplemented(); +} +Sys.UI.DomElement.registerClass('Sys.UI.DomElement'); +Sys.UI.DomElement.addCssClass = function Sys$UI$DomElement$addCssClass(element, className) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element", domElement: true}, + {name: "className", type: String} + ]); + if (e) throw e; + if (!Sys.UI.DomElement.containsCssClass(element, className)) { + if (element.className === '') { + element.className = className; + } + else { + element.className += ' ' + className; + } + } +} +Sys.UI.DomElement.containsCssClass = function Sys$UI$DomElement$containsCssClass(element, className) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element", domElement: true}, + {name: "className", type: String} + ]); + if (e) throw e; + return Array.contains(element.className.split(' '), className); +} +Sys.UI.DomElement.getBounds = function Sys$UI$DomElement$getBounds(element) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element", domElement: true} + ]); + if (e) throw e; + var offset = Sys.UI.DomElement.getLocation(element); + return new Sys.UI.Bounds(offset.x, offset.y, element.offsetWidth || 0, element.offsetHeight || 0); +} +var $get = Sys.UI.DomElement.getElementById = function Sys$UI$DomElement$getElementById(id, element) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "id", type: String}, + {name: "element", mayBeNull: true, domElement: true, optional: true} + ]); + if (e) throw e; + if (!element) return document.getElementById(id); + if (element.getElementById) return element.getElementById(id); + var nodeQueue = []; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; i++) { + var node = childNodes[i]; + if (node.nodeType == 1) { + nodeQueue[nodeQueue.length] = node; + } + } + while (nodeQueue.length) { + node = nodeQueue.shift(); + if (node.id == id) { + return node; + } + childNodes = node.childNodes; + for (i = 0; i < childNodes.length; i++) { + node = childNodes[i]; + if (node.nodeType == 1) { + nodeQueue[nodeQueue.length] = node; + } + } + } + return null; +} +switch(Sys.Browser.agent) { + case Sys.Browser.InternetExplorer: + Sys.UI.DomElement.getLocation = function Sys$UI$DomElement$getLocation(element) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element", domElement: true} + ]); + if (e) throw e; + if (element.self || element.nodeType === 9) return new Sys.UI.Point(0,0); + var clientRect = element.getBoundingClientRect(); + if (!clientRect) { + return new Sys.UI.Point(0,0); + } + var documentElement = element.ownerDocument.documentElement; + var offsetX = clientRect.left - 2 + documentElement.scrollLeft, + offsetY = clientRect.top - 2 + documentElement.scrollTop; + + try { + var f = element.ownerDocument.parentWindow.frameElement || null; + if (f) { + var offset = (f.frameBorder === "0" || f.frameBorder === "no") ? 2 : 0; + offsetX += offset; + offsetY += offset; + } + } + catch(ex) { + } + + return new Sys.UI.Point(offsetX, offsetY); + } + break; + case Sys.Browser.Safari: + Sys.UI.DomElement.getLocation = function Sys$UI$DomElement$getLocation(element) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element", domElement: true} + ]); + if (e) throw e; + if ((element.window && (element.window === element)) || element.nodeType === 9) return new Sys.UI.Point(0,0); + var offsetX = 0; + var offsetY = 0; + var previous = null; + var previousStyle = null; + var currentStyle; + for (var parent = element; parent; previous = parent, previousStyle = currentStyle, parent = parent.offsetParent) { + currentStyle = Sys.UI.DomElement._getCurrentStyle(parent); + var tagName = parent.tagName ? parent.tagName.toUpperCase() : null; + if ((parent.offsetLeft || parent.offsetTop) && + ((tagName !== "BODY") || (!previousStyle || previousStyle.position !== "absolute"))) { + offsetX += parent.offsetLeft; + offsetY += parent.offsetTop; + } + } + currentStyle = Sys.UI.DomElement._getCurrentStyle(element); + var elementPosition = currentStyle ? currentStyle.position : null; + if (!elementPosition || (elementPosition !== "absolute")) { + for (var parent = element.parentNode; parent; parent = parent.parentNode) { + tagName = parent.tagName ? parent.tagName.toUpperCase() : null; + if ((tagName !== "BODY") && (tagName !== "HTML") && (parent.scrollLeft || parent.scrollTop)) { + offsetX -= (parent.scrollLeft || 0); + offsetY -= (parent.scrollTop || 0); + } + currentStyle = Sys.UI.DomElement._getCurrentStyle(parent); + var parentPosition = currentStyle ? currentStyle.position : null; + if (parentPosition && (parentPosition === "absolute")) break; + } + } + return new Sys.UI.Point(offsetX, offsetY); + } + break; + case Sys.Browser.Opera: + Sys.UI.DomElement.getLocation = function Sys$UI$DomElement$getLocation(element) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element", domElement: true} + ]); + if (e) throw e; + if ((element.window && (element.window === element)) || element.nodeType === 9) return new Sys.UI.Point(0,0); + var offsetX = 0; + var offsetY = 0; + var previous = null; + for (var parent = element; parent; previous = parent, parent = parent.offsetParent) { + var tagName = parent.tagName; + offsetX += parent.offsetLeft || 0; + offsetY += parent.offsetTop || 0; + } + var elementPosition = element.style.position; + var elementPositioned = elementPosition && (elementPosition !== "static"); + for (var parent = element.parentNode; parent; parent = parent.parentNode) { + tagName = parent.tagName ? parent.tagName.toUpperCase() : null; + if ((tagName !== "BODY") && (tagName !== "HTML") && (parent.scrollLeft || parent.scrollTop) && + ((elementPositioned && + ((parent.style.overflow === "scroll") || (parent.style.overflow === "auto"))))) { + offsetX -= (parent.scrollLeft || 0); + offsetY -= (parent.scrollTop || 0); + } + var parentPosition = (parent && parent.style) ? parent.style.position : null; + elementPositioned = elementPositioned || (parentPosition && (parentPosition !== "static")); + } + return new Sys.UI.Point(offsetX, offsetY); + } + break; + default: + Sys.UI.DomElement.getLocation = function Sys$UI$DomElement$getLocation(element) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element", domElement: true} + ]); + if (e) throw e; + if ((element.window && (element.window === element)) || element.nodeType === 9) return new Sys.UI.Point(0,0); + var offsetX = 0; + var offsetY = 0; + var previous = null; + var previousStyle = null; + var currentStyle = null; + for (var parent = element; parent; previous = parent, previousStyle = currentStyle, parent = parent.offsetParent) { + var tagName = parent.tagName ? parent.tagName.toUpperCase() : null; + currentStyle = Sys.UI.DomElement._getCurrentStyle(parent); + if ((parent.offsetLeft || parent.offsetTop) && + !((tagName === "BODY") && + (!previousStyle || previousStyle.position !== "absolute"))) { + offsetX += parent.offsetLeft; + offsetY += parent.offsetTop; + } + if (previous !== null && currentStyle) { + if ((tagName !== "TABLE") && (tagName !== "TD") && (tagName !== "HTML")) { + offsetX += parseInt(currentStyle.borderLeftWidth) || 0; + offsetY += parseInt(currentStyle.borderTopWidth) || 0; + } + if (tagName === "TABLE" && + (currentStyle.position === "relative" || currentStyle.position === "absolute")) { + offsetX += parseInt(currentStyle.marginLeft) || 0; + offsetY += parseInt(currentStyle.marginTop) || 0; + } + } + } + currentStyle = Sys.UI.DomElement._getCurrentStyle(element); + var elementPosition = currentStyle ? currentStyle.position : null; + if (!elementPosition || (elementPosition !== "absolute")) { + for (var parent = element.parentNode; parent; parent = parent.parentNode) { + tagName = parent.tagName ? parent.tagName.toUpperCase() : null; + if ((tagName !== "BODY") && (tagName !== "HTML") && (parent.scrollLeft || parent.scrollTop)) { + offsetX -= (parent.scrollLeft || 0); + offsetY -= (parent.scrollTop || 0); + currentStyle = Sys.UI.DomElement._getCurrentStyle(parent); + if (currentStyle) { + offsetX += parseInt(currentStyle.borderLeftWidth) || 0; + offsetY += parseInt(currentStyle.borderTopWidth) || 0; + } + } + } + } + return new Sys.UI.Point(offsetX, offsetY); + } + break; +} +Sys.UI.DomElement.removeCssClass = function Sys$UI$DomElement$removeCssClass(element, className) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element", domElement: true}, + {name: "className", type: String} + ]); + if (e) throw e; + var currentClassName = ' ' + element.className + ' '; + var index = currentClassName.indexOf(' ' + className + ' '); + if (index >= 0) { + element.className = (currentClassName.substr(0, index) + ' ' + + currentClassName.substring(index + className.length + 1, currentClassName.length)).trim(); + } +} +Sys.UI.DomElement.setLocation = function Sys$UI$DomElement$setLocation(element, x, y) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element", domElement: true}, + {name: "x", type: Number, integer: true}, + {name: "y", type: Number, integer: true} + ]); + if (e) throw e; + var style = element.style; + style.position = 'absolute'; + style.left = x + "px"; + style.top = y + "px"; +} +Sys.UI.DomElement.toggleCssClass = function Sys$UI$DomElement$toggleCssClass(element, className) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element", domElement: true}, + {name: "className", type: String} + ]); + if (e) throw e; + if (Sys.UI.DomElement.containsCssClass(element, className)) { + Sys.UI.DomElement.removeCssClass(element, className); + } + else { + Sys.UI.DomElement.addCssClass(element, className); + } +} +Sys.UI.DomElement.getVisibilityMode = function Sys$UI$DomElement$getVisibilityMode(element) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element", domElement: true} + ]); + if (e) throw e; + return (element._visibilityMode === Sys.UI.VisibilityMode.hide) ? + Sys.UI.VisibilityMode.hide : + Sys.UI.VisibilityMode.collapse; +} +Sys.UI.DomElement.setVisibilityMode = function Sys$UI$DomElement$setVisibilityMode(element, value) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element", domElement: true}, + {name: "value", type: Sys.UI.VisibilityMode} + ]); + if (e) throw e; + Sys.UI.DomElement._ensureOldDisplayMode(element); + if (element._visibilityMode !== value) { + element._visibilityMode = value; + if (Sys.UI.DomElement.getVisible(element) === false) { + if (element._visibilityMode === Sys.UI.VisibilityMode.hide) { + element.style.display = element._oldDisplayMode; + } + else { + element.style.display = 'none'; + } + } + element._visibilityMode = value; + } +} +Sys.UI.DomElement.getVisible = function Sys$UI$DomElement$getVisible(element) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element", domElement: true} + ]); + if (e) throw e; + var style = element.currentStyle || Sys.UI.DomElement._getCurrentStyle(element); + if (!style) return true; + return (style.visibility !== 'hidden') && (style.display !== 'none'); +} +Sys.UI.DomElement.setVisible = function Sys$UI$DomElement$setVisible(element, value) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element", domElement: true}, + {name: "value", type: Boolean} + ]); + if (e) throw e; + if (value !== Sys.UI.DomElement.getVisible(element)) { + Sys.UI.DomElement._ensureOldDisplayMode(element); + element.style.visibility = value ? 'visible' : 'hidden'; + if (value || (element._visibilityMode === Sys.UI.VisibilityMode.hide)) { + element.style.display = element._oldDisplayMode; + } + else { + element.style.display = 'none'; + } + } +} +Sys.UI.DomElement._ensureOldDisplayMode = function Sys$UI$DomElement$_ensureOldDisplayMode(element) { + if (!element._oldDisplayMode) { + var style = element.currentStyle || Sys.UI.DomElement._getCurrentStyle(element); + element._oldDisplayMode = style ? style.display : null; + if (!element._oldDisplayMode || element._oldDisplayMode === 'none') { + switch(element.tagName.toUpperCase()) { + case 'DIV': case 'P': case 'ADDRESS': case 'BLOCKQUOTE': case 'BODY': case 'COL': + case 'COLGROUP': case 'DD': case 'DL': case 'DT': case 'FIELDSET': case 'FORM': + case 'H1': case 'H2': case 'H3': case 'H4': case 'H5': case 'H6': case 'HR': + case 'IFRAME': case 'LEGEND': case 'OL': case 'PRE': case 'TABLE': case 'TD': + case 'TH': case 'TR': case 'UL': + element._oldDisplayMode = 'block'; + break; + case 'LI': + element._oldDisplayMode = 'list-item'; + break; + default: + element._oldDisplayMode = 'inline'; + } + } + } +} +Sys.UI.DomElement._getWindow = function Sys$UI$DomElement$_getWindow(element) { + var doc = element.ownerDocument || element.document || element; + return doc.defaultView || doc.parentWindow; +} +Sys.UI.DomElement._getCurrentStyle = function Sys$UI$DomElement$_getCurrentStyle(element) { + if (element.nodeType === 3) return null; + var w = Sys.UI.DomElement._getWindow(element); + if (element.documentElement) element = element.documentElement; + var computedStyle = (w && (element !== w) && w.getComputedStyle) ? + w.getComputedStyle(element, null) : + element.currentStyle || element.style; + if (!computedStyle && (Sys.Browser.agent === Sys.Browser.Safari) && element.style) { + var oldDisplay = element.style.display; + var oldPosition = element.style.position; + element.style.position = 'absolute'; + element.style.display = 'block'; + var style = w.getComputedStyle(element, null); + element.style.display = oldDisplay; + element.style.position = oldPosition; + computedStyle = {}; + for (var n in style) { + computedStyle[n] = style[n]; + } + computedStyle.display = 'none'; + } + return computedStyle; +} + +Sys.IContainer = function Sys$IContainer() { + throw Error.notImplemented(); +} + function Sys$IContainer$addComponent(component) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "component", type: Sys.Component} + ]); + if (e) throw e; + throw Error.notImplemented(); + } + function Sys$IContainer$removeComponent(component) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "component", type: Sys.Component} + ]); + if (e) throw e; + throw Error.notImplemented(); + } + function Sys$IContainer$findComponent(id) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "id", type: String} + ]); + if (e) throw e; + throw Error.notImplemented(); + } + function Sys$IContainer$getComponents() { + /// + /// + if (arguments.length !== 0) throw Error.parameterCount(); + throw Error.notImplemented(); + } +Sys.IContainer.prototype = { + addComponent: Sys$IContainer$addComponent, + removeComponent: Sys$IContainer$removeComponent, + findComponent: Sys$IContainer$findComponent, + getComponents: Sys$IContainer$getComponents +} +Sys.IContainer.registerInterface("Sys.IContainer"); + +Sys._ScriptLoader = function Sys$_ScriptLoader() { + this._scriptsToLoad = null; + this._sessions = []; + this._scriptLoadedDelegate = Function.createDelegate(this, this._scriptLoadedHandler); +} + function Sys$_ScriptLoader$dispose() { + this._stopSession(); + this._loading = false; + if(this._events) { + delete this._events; + } + this._sessions = null; + this._currentSession = null; + this._scriptLoadedDelegate = null; + } + function Sys$_ScriptLoader$loadScripts(scriptTimeout, allScriptsLoadedCallback, scriptLoadFailedCallback, scriptLoadTimeoutCallback) { + /// + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "scriptTimeout", type: Number, integer: true}, + {name: "allScriptsLoadedCallback", type: Function, mayBeNull: true}, + {name: "scriptLoadFailedCallback", type: Function, mayBeNull: true}, + {name: "scriptLoadTimeoutCallback", type: Function, mayBeNull: true} + ]); + if (e) throw e; + var session = { + allScriptsLoadedCallback: allScriptsLoadedCallback, + scriptLoadFailedCallback: scriptLoadFailedCallback, + scriptLoadTimeoutCallback: scriptLoadTimeoutCallback, + scriptsToLoad: this._scriptsToLoad, + scriptTimeout: scriptTimeout }; + this._scriptsToLoad = null; + this._sessions[this._sessions.length] = session; + + if (!this._loading) { + this._nextSession(); + } + } + function Sys$_ScriptLoader$notifyScriptLoaded() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + + if(!this._loading) { + return; + } + this._currentTask._notified++; + + if(Sys.Browser.agent === Sys.Browser.Safari) { + if(this._currentTask._notified === 1) { + window.setTimeout(Function.createDelegate(this, function() { + this._scriptLoadedHandler(this._currentTask.get_scriptElement(), true); + }), 0); + } + } + } + function Sys$_ScriptLoader$queueCustomScriptTag(scriptAttributes) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "scriptAttributes"} + ]); + if (e) throw e; + if(!this._scriptsToLoad) { + this._scriptsToLoad = []; + } + Array.add(this._scriptsToLoad, scriptAttributes); + } + function Sys$_ScriptLoader$queueScriptBlock(scriptContent) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "scriptContent", type: String} + ]); + if (e) throw e; + if(!this._scriptsToLoad) { + this._scriptsToLoad = []; + } + Array.add(this._scriptsToLoad, {text: scriptContent}); + } + function Sys$_ScriptLoader$queueScriptReference(scriptUrl) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "scriptUrl", type: String} + ]); + if (e) throw e; + if(!this._scriptsToLoad) { + this._scriptsToLoad = []; + } + Array.add(this._scriptsToLoad, {src: scriptUrl}); + } + function Sys$_ScriptLoader$_createScriptElement(queuedScript) { + var scriptElement = document.createElement('script'); + scriptElement.type = 'text/javascript'; + for (var attr in queuedScript) { + scriptElement[attr] = queuedScript[attr]; + } + + return scriptElement; + } + function Sys$_ScriptLoader$_loadScriptsInternal() { + var session = this._currentSession; + if (session.scriptsToLoad && session.scriptsToLoad.length > 0) { + var nextScript = Array.dequeue(session.scriptsToLoad); + var scriptElement = this._createScriptElement(nextScript); + + if (scriptElement.text && Sys.Browser.agent === Sys.Browser.Safari) { + scriptElement.innerHTML = scriptElement.text; + delete scriptElement.text; + } + if (typeof(nextScript.src) === "string") { + this._currentTask = new Sys._ScriptLoaderTask(scriptElement, this._scriptLoadedDelegate); + this._currentTask.execute(); + } + else { + var headElements = document.getElementsByTagName('head'); + if (headElements.length === 0) { + throw new Error.invalidOperation(Sys.Res.scriptLoadFailedNoHead); + } + else { + headElements[0].appendChild(scriptElement); + } + + + Sys._ScriptLoader._clearScript(scriptElement); + this._loadScriptsInternal(); + } + } + else { + this._stopSession(); + var callback = session.allScriptsLoadedCallback; + if(callback) { + callback(this); + } + this._nextSession(); + } + } + function Sys$_ScriptLoader$_nextSession() { + if (this._sessions.length === 0) { + this._loading = false; + this._currentSession = null; + return; + } + this._loading = true; + + var session = Array.dequeue(this._sessions); + this._currentSession = session; + this._loadScriptsInternal(); + } + function Sys$_ScriptLoader$_raiseError(multipleCallbacks) { + var callback = this._currentSession.scriptLoadFailedCallback; + var scriptElement = this._currentTask.get_scriptElement(); + this._stopSession(); + + if(callback) { + callback(this, scriptElement, multipleCallbacks); + this._nextSession(); + } + else { + this._loading = false; + throw Sys._ScriptLoader._errorScriptLoadFailed(scriptElement.src, multipleCallbacks); + } + } + function Sys$_ScriptLoader$_scriptLoadedHandler(scriptElement, loaded) { + if(loaded && this._currentTask._notified) { + if(this._currentTask._notified > 1) { + this._raiseError(true); + } + else { + Array.add(Sys._ScriptLoader._getLoadedScripts(), scriptElement.src); + this._currentTask.dispose(); + this._currentTask = null; + this._loadScriptsInternal(); + } + } + else { + this._raiseError(false); + } + } + function Sys$_ScriptLoader$_scriptLoadTimeoutHandler() { + var callback = this._currentSession.scriptLoadTimeoutCallback; + this._stopSession(); + if(callback) { + callback(this); + } + this._nextSession(); + } + function Sys$_ScriptLoader$_stopSession() { + if(this._currentTask) { + this._currentTask.dispose(); + this._currentTask = null; + } + } +Sys._ScriptLoader.prototype = { + dispose: Sys$_ScriptLoader$dispose, + loadScripts: Sys$_ScriptLoader$loadScripts, + notifyScriptLoaded: Sys$_ScriptLoader$notifyScriptLoaded, + queueCustomScriptTag: Sys$_ScriptLoader$queueCustomScriptTag, + queueScriptBlock: Sys$_ScriptLoader$queueScriptBlock, + queueScriptReference: Sys$_ScriptLoader$queueScriptReference, + _createScriptElement: Sys$_ScriptLoader$_createScriptElement, + _loadScriptsInternal: Sys$_ScriptLoader$_loadScriptsInternal, + _nextSession: Sys$_ScriptLoader$_nextSession, + _raiseError: Sys$_ScriptLoader$_raiseError, + _scriptLoadedHandler: Sys$_ScriptLoader$_scriptLoadedHandler, + _scriptLoadTimeoutHandler: Sys$_ScriptLoader$_scriptLoadTimeoutHandler, + _stopSession: Sys$_ScriptLoader$_stopSession +} +Sys._ScriptLoader.registerClass('Sys._ScriptLoader', null, Sys.IDisposable); +Sys._ScriptLoader.getInstance = function Sys$_ScriptLoader$getInstance() { + var sl = Sys._ScriptLoader._activeInstance; + if(!sl) { + sl = Sys._ScriptLoader._activeInstance = new Sys._ScriptLoader(); + } + return sl; +} +Sys._ScriptLoader.isScriptLoaded = function Sys$_ScriptLoader$isScriptLoaded(scriptSrc) { + var dummyScript = document.createElement('script'); + dummyScript.src = scriptSrc; + return Array.contains(Sys._ScriptLoader._getLoadedScripts(), dummyScript.src); +} +Sys._ScriptLoader.readLoadedScripts = function Sys$_ScriptLoader$readLoadedScripts() { + if(!Sys._ScriptLoader._referencedScripts) { + var referencedScripts = Sys._ScriptLoader._referencedScripts = []; + var existingScripts = document.getElementsByTagName('script'); + for (i = existingScripts.length - 1; i >= 0; i--) { + var scriptNode = existingScripts[i]; + var scriptSrc = scriptNode.src; + if (scriptSrc.length) { + if (!Array.contains(referencedScripts, scriptSrc)) { + Array.add(referencedScripts, scriptSrc); + } + } + } + } +} +Sys._ScriptLoader._clearScript = function Sys$_ScriptLoader$_clearScript(scriptElement) { + if (!Sys.Debug.isDebug) { + scriptElement.parentNode.removeChild(scriptElement); + } +} +Sys._ScriptLoader._errorScriptLoadFailed = function Sys$_ScriptLoader$_errorScriptLoadFailed(scriptUrl, multipleCallbacks) { + var errorMessage; + if(multipleCallbacks) { + errorMessage = Sys.Res.scriptLoadMultipleCallbacks; + } + else { + errorMessage = Sys.Res.scriptLoadFailedDebug; + } + var displayMessage = "Sys.ScriptLoadFailedException: " + String.format(errorMessage, scriptUrl); + var e = Error.create(displayMessage, {name: 'Sys.ScriptLoadFailedException', 'scriptUrl': scriptUrl }); + e.popStackFrame(); + return e; +} +Sys._ScriptLoader._getLoadedScripts = function Sys$_ScriptLoader$_getLoadedScripts() { + if(!Sys._ScriptLoader._referencedScripts) { + Sys._ScriptLoader._referencedScripts = []; + Sys._ScriptLoader.readLoadedScripts(); + } + return Sys._ScriptLoader._referencedScripts; +} + +Sys._ScriptLoaderTask = function Sys$_ScriptLoaderTask(scriptElement, completedCallback) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "scriptElement", domElement: true}, + {name: "completedCallback", type: Function} + ]); + if (e) throw e; + this._scriptElement = scriptElement; + this._completedCallback = completedCallback; + this._notified = 0; +} + function Sys$_ScriptLoaderTask$get_scriptElement() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._scriptElement; + } + function Sys$_ScriptLoaderTask$dispose() { + if(this._disposed) { + return; + } + this._disposed = true; + this._removeScriptElementHandlers(); + Sys._ScriptLoader._clearScript(this._scriptElement); + this._scriptElement = null; + } + function Sys$_ScriptLoaderTask$execute() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + this._addScriptElementHandlers(); + var headElements = document.getElementsByTagName('head'); + if (headElements.length === 0) { + throw new Error.invalidOperation(Sys.Res.scriptLoadFailedNoHead); + } + else { + headElements[0].appendChild(this._scriptElement); + } + } + function Sys$_ScriptLoaderTask$_addScriptElementHandlers() { + this._scriptLoadDelegate = Function.createDelegate(this, this._scriptLoadHandler); + + if (Sys.Browser.agent !== Sys.Browser.InternetExplorer) { + this._scriptElement.readyState = 'loaded'; + $addHandler(this._scriptElement, 'load', this._scriptLoadDelegate); + } + else { + $addHandler(this._scriptElement, 'readystatechange', this._scriptLoadDelegate); + } + if (this._scriptElement.addEventListener) { + this._scriptErrorDelegate = Function.createDelegate(this, this._scriptErrorHandler); + this._scriptElement.addEventListener('error', this._scriptErrorDelegate, false); + } + } + function Sys$_ScriptLoaderTask$_removeScriptElementHandlers() { + if(this._scriptLoadDelegate) { + var scriptElement = this.get_scriptElement(); + if (Sys.Browser.agent !== Sys.Browser.InternetExplorer) { + $removeHandler(scriptElement, 'load', this._scriptLoadDelegate); + } + else { + $removeHandler(scriptElement, 'readystatechange', this._scriptLoadDelegate); + } + if (this._scriptErrorDelegate) { + this._scriptElement.removeEventListener('error', this._scriptErrorDelegate, false); + this._scriptErrorDelegate = null; + } + this._scriptLoadDelegate = null; + } + } + function Sys$_ScriptLoaderTask$_scriptErrorHandler() { + if(this._disposed) { + return; + } + + this._completedCallback(this.get_scriptElement(), false); + } + function Sys$_ScriptLoaderTask$_scriptLoadHandler() { + if(this._disposed) { + return; + } + var scriptElement = this.get_scriptElement(); + if ((scriptElement.readyState !== 'loaded') && + (scriptElement.readyState !== 'complete')) { + return; + } + + var _this = this; + window.setTimeout(function() { + _this._completedCallback(scriptElement, true); + }, 0); + } +Sys._ScriptLoaderTask.prototype = { + get_scriptElement: Sys$_ScriptLoaderTask$get_scriptElement, + dispose: Sys$_ScriptLoaderTask$dispose, + execute: Sys$_ScriptLoaderTask$execute, + _addScriptElementHandlers: Sys$_ScriptLoaderTask$_addScriptElementHandlers, + _removeScriptElementHandlers: Sys$_ScriptLoaderTask$_removeScriptElementHandlers, + _scriptErrorHandler: Sys$_ScriptLoaderTask$_scriptErrorHandler, + _scriptLoadHandler: Sys$_ScriptLoaderTask$_scriptLoadHandler +} +Sys._ScriptLoaderTask.registerClass("Sys._ScriptLoaderTask", null, Sys.IDisposable); + +Sys.ApplicationLoadEventArgs = function Sys$ApplicationLoadEventArgs(components, isPartialLoad) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "components", type: Array, elementType: Sys.Component}, + {name: "isPartialLoad", type: Boolean} + ]); + if (e) throw e; + Sys.ApplicationLoadEventArgs.initializeBase(this); + this._components = components; + this._isPartialLoad = isPartialLoad; +} + + function Sys$ApplicationLoadEventArgs$get_components() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._components; + } + function Sys$ApplicationLoadEventArgs$get_isPartialLoad() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._isPartialLoad; + } +Sys.ApplicationLoadEventArgs.prototype = { + get_components: Sys$ApplicationLoadEventArgs$get_components, + get_isPartialLoad: Sys$ApplicationLoadEventArgs$get_isPartialLoad +} +Sys.ApplicationLoadEventArgs.registerClass('Sys.ApplicationLoadEventArgs', Sys.EventArgs); +Sys.HistoryEventArgs = function Sys$HistoryEventArgs(state) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "state", type: Object} + ]); + if (e) throw e; + Sys.HistoryEventArgs.initializeBase(this); + this._state = state; +} + function Sys$HistoryEventArgs$get_state() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._state; + } +Sys.HistoryEventArgs.prototype = { + get_state: Sys$HistoryEventArgs$get_state +} +Sys.HistoryEventArgs.registerClass('Sys.HistoryEventArgs', Sys.EventArgs); + +Sys._Application = function Sys$_Application() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + Sys._Application.initializeBase(this); + this._disposableObjects = []; + this._components = {}; + this._createdComponents = []; + this._secondPassComponents = []; + this._appLoadHandler = null; + this._beginRequestHandler = null; + this._clientId = null; + this._currentEntry = ''; + this._endRequestHandler = null; + this._history = null; + this._enableHistory = false; + this._historyEnabledInScriptManager = false; + this._historyFrame = null; + this._historyInitialized = false; + this._historyInitialLength = 0; + this._historyLength = 0; + this._historyPointIsNew = false; + this._ignoreTimer = false; + this._initialState = null; + this._state = {}; + this._timerCookie = 0; + this._timerHandler = null; + this._uniqueId = null; + this._unloadHandlerDelegate = Function.createDelegate(this, this._unloadHandler); + this._loadHandlerDelegate = Function.createDelegate(this, this._loadHandler); + Sys.UI.DomEvent.addHandler(window, "unload", this._unloadHandlerDelegate); + Sys.UI.DomEvent.addHandler(window, "load", this._loadHandlerDelegate); +} + function Sys$_Application$get_isCreatingComponents() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._creatingComponents; + } + function Sys$_Application$get_stateString() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + var hash = window.location.hash; + if (this._isSafari2()) { + var history = this._getHistory(); + if (history) { + hash = history[window.history.length - this._historyInitialLength]; + } + } + if ((hash.length > 0) && (hash.charAt(0) === '#')) { + hash = hash.substring(1); + } + if (Sys.Browser.agent === Sys.Browser.Firefox) { + hash = this._serializeState(this._deserializeState(hash, true)); + } + return hash; + } + function Sys$_Application$get_enableHistory() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._enableHistory; + } + function Sys$_Application$set_enableHistory(value) { + var e = Function._validateParams(arguments, [{name: "value", type: Boolean}]); + if (e) throw e; + if (this._initialized && !this._initializing) { + throw Error.invalidOperation(Sys.Res.historyCannotEnableHistory); + } + else if (this._historyEnabledInScriptManager && !value) { + throw Error.invalidOperation(Sys.Res.invalidHistorySettingCombination); + } + this._enableHistory = value; + } + function Sys$_Application$add_init(handler) { + /// + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + if (this._initialized) { + handler(this, Sys.EventArgs.Empty); + } + else { + this.get_events().addHandler("init", handler); + } + } + function Sys$_Application$remove_init(handler) { + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + this.get_events().removeHandler("init", handler); + } + function Sys$_Application$add_load(handler) { + /// + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + this.get_events().addHandler("load", handler); + } + function Sys$_Application$remove_load(handler) { + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + this.get_events().removeHandler("load", handler); + } + function Sys$_Application$add_navigate(handler) { + /// + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + this.get_events().addHandler("navigate", handler); + } + function Sys$_Application$remove_navigate(handler) { + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + this.get_events().removeHandler("navigate", handler); + } + function Sys$_Application$add_unload(handler) { + /// + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + this.get_events().addHandler("unload", handler); + } + function Sys$_Application$remove_unload(handler) { + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + this.get_events().removeHandler("unload", handler); + } + function Sys$_Application$addComponent(component) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "component", type: Sys.Component} + ]); + if (e) throw e; + var id = component.get_id(); + if (!id) throw Error.invalidOperation(Sys.Res.cantAddWithoutId); + if (typeof(this._components[id]) !== 'undefined') throw Error.invalidOperation(String.format(Sys.Res.appDuplicateComponent, id)); + this._components[id] = component; + } + function Sys$_Application$addHistoryPoint(state, title) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "state", type: Object}, + {name: "title", type: String, mayBeNull: true, optional: true} + ]); + if (e) throw e; + if (!this._enableHistory) throw Error.invalidOperation(Sys.Res.historyCannotAddHistoryPointWithHistoryDisabled); + for (var n in state) { + var v = state[n]; + var t = typeof(v); + if ((v !== null) && ((t === 'object') || (t === 'function') || (t === 'undefined'))) { + throw Error.argument('state', Sys.Res.stateMustBeStringDictionary); + } + } + this._ensureHistory(); + var initialState = this._state; + for (var key in state) { + var value = state[key]; + if (value === null) { + if (typeof(initialState[key]) !== 'undefined') { + delete initialState[key]; + } + } + else { + initialState[key] = value; + } + } + var entry = this._serializeState(initialState); + this._historyPointIsNew = true; + this._setState(entry, title); + this._raiseNavigate(); + } + function Sys$_Application$beginCreateComponents() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + this._creatingComponents = true; + } + function Sys$_Application$dispose() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (!this._disposing) { + this._disposing = true; + if (this._timerCookie) { + window.clearTimeout(this._timerCookie); + delete this._timerCookie; + } + if (this._endRequestHandler) { + Sys.WebForms.PageRequestManager.getInstance().remove_endRequest(this._endRequestHandler); + delete this._endRequestHandler; + } + if (this._beginRequestHandler) { + Sys.WebForms.PageRequestManager.getInstance().remove_beginRequest(this._beginRequestHandler); + delete this._beginRequestHandler; + } + if (window.pageUnload) { + window.pageUnload(this, Sys.EventArgs.Empty); + } + var unloadHandler = this.get_events().getHandler("unload"); + if (unloadHandler) { + unloadHandler(this, Sys.EventArgs.Empty); + } + var disposableObjects = Array.clone(this._disposableObjects); + for (var i = 0, l = disposableObjects.length; i < l; i++) { + disposableObjects[i].dispose(); + } + Array.clear(this._disposableObjects); + Sys.UI.DomEvent.removeHandler(window, "unload", this._unloadHandlerDelegate); + if(this._loadHandlerDelegate) { + Sys.UI.DomEvent.removeHandler(window, "load", this._loadHandlerDelegate); + this._loadHandlerDelegate = null; + } + var sl = Sys._ScriptLoader.getInstance(); + if(sl) { + sl.dispose(); + } + Sys._Application.callBaseMethod(this, 'dispose'); + } + } + function Sys$_Application$endCreateComponents() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + var components = this._secondPassComponents; + for (var i = 0, l = components.length; i < l; i++) { + var component = components[i].component; + Sys$Component$_setReferences(component, components[i].references); + component.endUpdate(); + } + this._secondPassComponents = []; + this._creatingComponents = false; + } + function Sys$_Application$findComponent(id, parent) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "id", type: String}, + {name: "parent", mayBeNull: true, optional: true} + ]); + if (e) throw e; + return (parent ? + ((Sys.IContainer.isInstanceOfType(parent)) ? + parent.findComponent(id) : + parent[id] || null) : + Sys.Application._components[id] || null); + } + function Sys$_Application$getComponents() { + /// + /// + if (arguments.length !== 0) throw Error.parameterCount(); + var res = []; + var components = this._components; + for (var name in components) { + res[res.length] = components[name]; + } + return res; + } + function Sys$_Application$initialize() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if(!this._initialized && !this._initializing) { + this._initializing = true; + window.setTimeout(Function.createDelegate(this, this._doInitialize), 0); + } + } + function Sys$_Application$notifyScriptLoaded() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + var sl = Sys._ScriptLoader.getInstance(); + if(sl) { + sl.notifyScriptLoaded(); + } + } + function Sys$_Application$registerDisposableObject(object) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "object", type: Sys.IDisposable} + ]); + if (e) throw e; + if (!this._disposing) { + this._disposableObjects[this._disposableObjects.length] = object; + } + } + function Sys$_Application$raiseLoad() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + var h = this.get_events().getHandler("load"); + var args = new Sys.ApplicationLoadEventArgs(Array.clone(this._createdComponents), !this._initializing); + if (h) { + h(this, args); + } + if (window.pageLoad) { + window.pageLoad(this, args); + } + this._createdComponents = []; + } + function Sys$_Application$removeComponent(component) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "component", type: Sys.Component} + ]); + if (e) throw e; + var id = component.get_id(); + if (id) delete this._components[id]; + } + function Sys$_Application$setServerId(clientId, uniqueId) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "clientId", type: String}, + {name: "uniqueId", type: String} + ]); + if (e) throw e; + this._clientId = clientId; + this._uniqueId = uniqueId; + } + function Sys$_Application$setServerState(value) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "value", type: String} + ]); + if (e) throw e; + this._ensureHistory(); + this._state.__s = value; + this._updateHiddenField(value); + } + function Sys$_Application$unregisterDisposableObject(object) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "object", type: Sys.IDisposable} + ]); + if (e) throw e; + if (!this._disposing) { + Array.remove(this._disposableObjects, object); + } + } + function Sys$_Application$_addComponentToSecondPass(component, references) { + this._secondPassComponents[this._secondPassComponents.length] = {component: component, references: references}; + } + function Sys$_Application$_deserializeState(entry, skipDecodeUri) { + var result = {}; + entry = entry || ''; + var serverSeparator = entry.indexOf('&&'); + if ((serverSeparator !== -1) && (serverSeparator + 2 < entry.length)) { + result.__s = entry.substr(serverSeparator + 2); + entry = entry.substr(0, serverSeparator); + } + var tokens = entry.split('&'); + for (var i = 0, l = tokens.length; i < l; i++) { + var token = tokens[i]; + var equal = token.indexOf('='); + if ((equal !== -1) && (equal + 1 < token.length)) { + var name = token.substr(0, equal); + var value = token.substr(equal + 1); + result[name] = skipDecodeUri ? value : decodeURIComponent(value); + } + } + return result; + } + function Sys$_Application$_doInitialize() { + Sys._Application.callBaseMethod(this, 'initialize'); + + var handler = this.get_events().getHandler("init"); + if (handler) { + this.beginCreateComponents(); + handler(this, Sys.EventArgs.Empty); + this.endCreateComponents(); + } + if (Sys.WebForms) { + this._beginRequestHandler = Function.createDelegate(this, this._onPageRequestManagerBeginRequest); + Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(this._beginRequestHandler); + this._endRequestHandler = Function.createDelegate(this, this._onPageRequestManagerEndRequest); + Sys.WebForms.PageRequestManager.getInstance().add_endRequest(this._endRequestHandler); + } + + var loadedEntry = this.get_stateString(); + if (loadedEntry !== this._currentEntry) { + this._navigate(loadedEntry); + } + + this.raiseLoad(); + this._initializing = false; + } + function Sys$_Application$_enableHistoryInScriptManager() { + this._enableHistory = true; + this._historyEnabledInScriptManager = true; + } + function Sys$_Application$_ensureHistory() { + if (!this._historyInitialized && this._enableHistory) { + if ((Sys.Browser.agent === Sys.Browser.InternetExplorer) && (Sys.Browser.documentMode < 8)) { + this._historyFrame = document.getElementById('__historyFrame'); + if (!this._historyFrame) throw Error.invalidOperation(Sys.Res.historyMissingFrame); + this._ignoreIFrame = true; + } + if (this._isSafari2()) { + var historyElement = document.getElementById('__history'); + if (!historyElement) throw Error.invalidOperation(Sys.Res.historyMissingHiddenInput); + this._setHistory([window.location.hash]); + this._historyInitialLength = window.history.length; + } + + this._timerHandler = Function.createDelegate(this, this._onIdle); + this._timerCookie = window.setTimeout(this._timerHandler, 100); + + try { + this._initialState = this._deserializeState(this.get_stateString()); + } catch(e) {} + + this._historyInitialized = true; + } + } + function Sys$_Application$_getHistory() { + var historyElement = document.getElementById('__history'); + if (!historyElement) return ''; + var v = historyElement.value; + return v ? Sys.Serialization.JavaScriptSerializer.deserialize(v, true) : ''; + } + function Sys$_Application$_isSafari2() { + return (Sys.Browser.agent === Sys.Browser.Safari) && + (Sys.Browser.version <= 419.3); + } + function Sys$_Application$_loadHandler() { + if(this._loadHandlerDelegate) { + Sys.UI.DomEvent.removeHandler(window, "load", this._loadHandlerDelegate); + this._loadHandlerDelegate = null; + } + this.initialize(); + } + function Sys$_Application$_navigate(entry) { + this._ensureHistory(); + var state = this._deserializeState(entry); + + if (this._uniqueId) { + var oldServerEntry = this._state.__s || ''; + var newServerEntry = state.__s || ''; + if (newServerEntry !== oldServerEntry) { + this._updateHiddenField(newServerEntry); + __doPostBack(this._uniqueId, newServerEntry); + this._state = state; + return; + } + } + this._setState(entry); + this._state = state; + this._raiseNavigate(); + } + function Sys$_Application$_onIdle() { + delete this._timerCookie; + + var entry = this.get_stateString(); + if (entry !== this._currentEntry) { + if (!this._ignoreTimer) { + this._historyPointIsNew = false; + this._navigate(entry); + this._historyLength = window.history.length; + } + } + else { + this._ignoreTimer = false; + } + this._timerCookie = window.setTimeout(this._timerHandler, 100); + } + function Sys$_Application$_onIFrameLoad(entry) { + this._ensureHistory(); + if (!this._ignoreIFrame) { + this._historyPointIsNew = false; + this._navigate(entry); + } + this._ignoreIFrame = false; + } + function Sys$_Application$_onPageRequestManagerBeginRequest(sender, args) { + this._ignoreTimer = true; + } + function Sys$_Application$_onPageRequestManagerEndRequest(sender, args) { + var dataItem = args.get_dataItems()[this._clientId]; + var eventTarget = document.getElementById("__EVENTTARGET"); + if (eventTarget && eventTarget.value === this._uniqueId) { + eventTarget.value = ''; + } + if (typeof(dataItem) !== 'undefined') { + this.setServerState(dataItem); + this._historyPointIsNew = true; + } + else { + this._ignoreTimer = false; + } + var entry = this._serializeState(this._state); + if (entry !== this._currentEntry) { + this._ignoreTimer = true; + this._setState(entry); + this._raiseNavigate(); + } + } + function Sys$_Application$_raiseNavigate() { + var h = this.get_events().getHandler("navigate"); + var stateClone = {}; + for (var key in this._state) { + if (key !== '__s') { + stateClone[key] = this._state[key]; + } + } + var args = new Sys.HistoryEventArgs(stateClone); + if (h) { + h(this, args); + } + } + function Sys$_Application$_serializeState(state) { + var serialized = []; + for (var key in state) { + var value = state[key]; + if (key === '__s') { + var serverState = value; + } + else { + if (key.indexOf('=') !== -1) throw Error.argument('state', Sys.Res.stateFieldNameInvalid); + serialized[serialized.length] = key + '=' + encodeURIComponent(value); + } + } + return serialized.join('&') + (serverState ? '&&' + serverState : ''); + } + function Sys$_Application$_setHistory(historyArray) { + var historyElement = document.getElementById('__history'); + if (historyElement) { + historyElement.value = Sys.Serialization.JavaScriptSerializer.serialize(historyArray); + } + } + function Sys$_Application$_setState(entry, title) { + entry = entry || ''; + if (entry !== this._currentEntry) { + if (window.theForm) { + var action = window.theForm.action; + var hashIndex = action.indexOf('#'); + window.theForm.action = ((hashIndex !== -1) ? action.substring(0, hashIndex) : action) + '#' + entry; + } + + if (this._historyFrame && this._historyPointIsNew) { + this._ignoreIFrame = true; + this._historyPointIsNew = false; + var frameDoc = this._historyFrame.contentWindow.document; + frameDoc.open("javascript:''"); + frameDoc.write("" + (title || document.title) + + "parent.Sys.Application._onIFrameLoad('" + + entry + "');"); + frameDoc.close(); + } + this._ignoreTimer = false; + var currentHash = this.get_stateString(); + this._currentEntry = entry; + if (entry !== currentHash) { + var loc = document.location; + if (loc.href.length - loc.hash.length + entry.length > 1024) { + throw Error.invalidOperation(Sys.Res.urlMustBeLessThan1024chars); + } + if (this._isSafari2()) { + var history = this._getHistory(); + history[window.history.length - this._historyInitialLength + 1] = entry; + this._setHistory(history); + this._historyLength = window.history.length + 1; + var form = document.createElement('form'); + form.method = 'get'; + form.action = '#' + entry; + document.appendChild(form); + form.submit(); + document.removeChild(form); + } + else { + window.location.hash = entry; + } + if ((typeof(title) !== 'undefined') && (title !== null)) { + document.title = title; + } + } + } + } + function Sys$_Application$_unloadHandler(event) { + this.dispose(); + } + function Sys$_Application$_updateHiddenField(value) { + if (this._clientId) { + var serverStateField = document.getElementById(this._clientId); + if (serverStateField) { + serverStateField.value = value; + } + } + } +Sys._Application.prototype = { + _creatingComponents: false, + _disposing: false, + get_isCreatingComponents: Sys$_Application$get_isCreatingComponents, + get_stateString: Sys$_Application$get_stateString, + get_enableHistory: Sys$_Application$get_enableHistory, + set_enableHistory: Sys$_Application$set_enableHistory, + add_init: Sys$_Application$add_init, + remove_init: Sys$_Application$remove_init, + add_load: Sys$_Application$add_load, + remove_load: Sys$_Application$remove_load, + add_navigate: Sys$_Application$add_navigate, + remove_navigate: Sys$_Application$remove_navigate, + add_unload: Sys$_Application$add_unload, + remove_unload: Sys$_Application$remove_unload, + addComponent: Sys$_Application$addComponent, + addHistoryPoint: Sys$_Application$addHistoryPoint, + beginCreateComponents: Sys$_Application$beginCreateComponents, + dispose: Sys$_Application$dispose, + endCreateComponents: Sys$_Application$endCreateComponents, + findComponent: Sys$_Application$findComponent, + getComponents: Sys$_Application$getComponents, + initialize: Sys$_Application$initialize, + notifyScriptLoaded: Sys$_Application$notifyScriptLoaded, + registerDisposableObject: Sys$_Application$registerDisposableObject, + raiseLoad: Sys$_Application$raiseLoad, + removeComponent: Sys$_Application$removeComponent, + setServerId: Sys$_Application$setServerId, + setServerState: Sys$_Application$setServerState, + unregisterDisposableObject: Sys$_Application$unregisterDisposableObject, + _addComponentToSecondPass: Sys$_Application$_addComponentToSecondPass, + _deserializeState: Sys$_Application$_deserializeState, + _doInitialize: Sys$_Application$_doInitialize, + _enableHistoryInScriptManager: Sys$_Application$_enableHistoryInScriptManager, + _ensureHistory: Sys$_Application$_ensureHistory, + _getHistory: Sys$_Application$_getHistory, + _isSafari2: Sys$_Application$_isSafari2, + _loadHandler: Sys$_Application$_loadHandler, + _navigate: Sys$_Application$_navigate, + _onIdle: Sys$_Application$_onIdle, + _onIFrameLoad: Sys$_Application$_onIFrameLoad, + _onPageRequestManagerBeginRequest: Sys$_Application$_onPageRequestManagerBeginRequest, + _onPageRequestManagerEndRequest: Sys$_Application$_onPageRequestManagerEndRequest, + _raiseNavigate: Sys$_Application$_raiseNavigate, + _serializeState: Sys$_Application$_serializeState, + _setHistory: Sys$_Application$_setHistory, + _setState: Sys$_Application$_setState, + _unloadHandler: Sys$_Application$_unloadHandler, + _updateHiddenField: Sys$_Application$_updateHiddenField +} +Sys._Application.registerClass('Sys._Application', Sys.Component, Sys.IContainer); +Sys.Application = new Sys._Application(); +var $find = Sys.Application.findComponent; +Type.registerNamespace('Sys.Net'); + +Sys.Net.WebRequestExecutor = function Sys$Net$WebRequestExecutor() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + this._webRequest = null; + this._resultObject = null; +} + function Sys$Net$WebRequestExecutor$get_webRequest() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._webRequest; + } + function Sys$Net$WebRequestExecutor$_set_webRequest(value) { + if (this.get_started()) { + throw Error.invalidOperation(String.format(Sys.Res.cannotCallOnceStarted, 'set_webRequest')); + } + this._webRequest = value; + } + function Sys$Net$WebRequestExecutor$get_started() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + throw Error.notImplemented(); + } + function Sys$Net$WebRequestExecutor$get_responseAvailable() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + throw Error.notImplemented(); + } + function Sys$Net$WebRequestExecutor$get_timedOut() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + throw Error.notImplemented(); + } + function Sys$Net$WebRequestExecutor$get_aborted() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + throw Error.notImplemented(); + } + function Sys$Net$WebRequestExecutor$get_responseData() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + throw Error.notImplemented(); + } + function Sys$Net$WebRequestExecutor$get_statusCode() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + throw Error.notImplemented(); + } + function Sys$Net$WebRequestExecutor$get_statusText() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + throw Error.notImplemented(); + } + function Sys$Net$WebRequestExecutor$get_xml() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + throw Error.notImplemented(); + } + function Sys$Net$WebRequestExecutor$get_object() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (!this._resultObject) { + this._resultObject = Sys.Serialization.JavaScriptSerializer.deserialize(this.get_responseData()); + } + return this._resultObject; + } + function Sys$Net$WebRequestExecutor$executeRequest() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + throw Error.notImplemented(); + } + function Sys$Net$WebRequestExecutor$abort() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + throw Error.notImplemented(); + } + function Sys$Net$WebRequestExecutor$getResponseHeader(header) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "header", type: String} + ]); + if (e) throw e; + throw Error.notImplemented(); + } + function Sys$Net$WebRequestExecutor$getAllResponseHeaders() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + throw Error.notImplemented(); + } +Sys.Net.WebRequestExecutor.prototype = { + get_webRequest: Sys$Net$WebRequestExecutor$get_webRequest, + _set_webRequest: Sys$Net$WebRequestExecutor$_set_webRequest, + get_started: Sys$Net$WebRequestExecutor$get_started, + get_responseAvailable: Sys$Net$WebRequestExecutor$get_responseAvailable, + get_timedOut: Sys$Net$WebRequestExecutor$get_timedOut, + get_aborted: Sys$Net$WebRequestExecutor$get_aborted, + get_responseData: Sys$Net$WebRequestExecutor$get_responseData, + get_statusCode: Sys$Net$WebRequestExecutor$get_statusCode, + get_statusText: Sys$Net$WebRequestExecutor$get_statusText, + get_xml: Sys$Net$WebRequestExecutor$get_xml, + get_object: Sys$Net$WebRequestExecutor$get_object, + executeRequest: Sys$Net$WebRequestExecutor$executeRequest, + abort: Sys$Net$WebRequestExecutor$abort, + getResponseHeader: Sys$Net$WebRequestExecutor$getResponseHeader, + getAllResponseHeaders: Sys$Net$WebRequestExecutor$getAllResponseHeaders +} +Sys.Net.WebRequestExecutor.registerClass('Sys.Net.WebRequestExecutor'); + +Sys.Net.XMLDOM = function Sys$Net$XMLDOM(markup) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "markup", type: String} + ]); + if (e) throw e; + if (!window.DOMParser) { + var progIDs = [ 'Msxml2.DOMDocument.3.0', 'Msxml2.DOMDocument' ]; + for (var i = 0, l = progIDs.length; i < l; i++) { + try { + var xmlDOM = new ActiveXObject(progIDs[i]); + xmlDOM.async = false; + xmlDOM.loadXML(markup); + xmlDOM.setProperty('SelectionLanguage', 'XPath'); + return xmlDOM; + } + catch (ex) { + } + } + } + else { + try { + var domParser = new window.DOMParser(); + return domParser.parseFromString(markup, 'text/xml'); + } + catch (ex) { + } + } + return null; +} +Sys.Net.XMLHttpExecutor = function Sys$Net$XMLHttpExecutor() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + Sys.Net.XMLHttpExecutor.initializeBase(this); + var _this = this; + this._xmlHttpRequest = null; + this._webRequest = null; + this._responseAvailable = false; + this._timedOut = false; + this._timer = null; + this._aborted = false; + this._started = false; + this._onReadyStateChange = (function () { + + if (_this._xmlHttpRequest.readyState === 4 ) { + try { + if (typeof(_this._xmlHttpRequest.status) === "undefined") { + return; + } + } + catch(ex) { + return; + } + + _this._clearTimer(); + _this._responseAvailable = true; + try { + _this._webRequest.completed(Sys.EventArgs.Empty); + } + finally { + if (_this._xmlHttpRequest != null) { + _this._xmlHttpRequest.onreadystatechange = Function.emptyMethod; + _this._xmlHttpRequest = null; + } + } + } + }); + this._clearTimer = (function() { + if (_this._timer != null) { + window.clearTimeout(_this._timer); + _this._timer = null; + } + }); + this._onTimeout = (function() { + if (!_this._responseAvailable) { + _this._clearTimer(); + _this._timedOut = true; + _this._xmlHttpRequest.onreadystatechange = Function.emptyMethod; + _this._xmlHttpRequest.abort(); + _this._webRequest.completed(Sys.EventArgs.Empty); + _this._xmlHttpRequest = null; + } + }); +} + function Sys$Net$XMLHttpExecutor$get_timedOut() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._timedOut; + } + function Sys$Net$XMLHttpExecutor$get_started() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._started; + } + function Sys$Net$XMLHttpExecutor$get_responseAvailable() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._responseAvailable; + } + function Sys$Net$XMLHttpExecutor$get_aborted() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._aborted; + } + function Sys$Net$XMLHttpExecutor$executeRequest() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + this._webRequest = this.get_webRequest(); + if (this._started) { + throw Error.invalidOperation(String.format(Sys.Res.cannotCallOnceStarted, 'executeRequest')); + } + if (this._webRequest === null) { + throw Error.invalidOperation(Sys.Res.nullWebRequest); + } + var body = this._webRequest.get_body(); + var headers = this._webRequest.get_headers(); + this._xmlHttpRequest = new XMLHttpRequest(); + this._xmlHttpRequest.onreadystatechange = this._onReadyStateChange; + var verb = this._webRequest.get_httpVerb(); + this._xmlHttpRequest.open(verb, this._webRequest.getResolvedUrl(), true ); + if (headers) { + for (var header in headers) { + var val = headers[header]; + if (typeof(val) !== "function") + this._xmlHttpRequest.setRequestHeader(header, val); + } + } + if (verb.toLowerCase() === "post") { + if ((headers === null) || !headers['Content-Type']) { + this._xmlHttpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8'); + } + if (!body) { + body = ""; + } + } + var timeout = this._webRequest.get_timeout(); + if (timeout > 0) { + this._timer = window.setTimeout(Function.createDelegate(this, this._onTimeout), timeout); + } + this._xmlHttpRequest.send(body); + this._started = true; + } + function Sys$Net$XMLHttpExecutor$getResponseHeader(header) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "header", type: String} + ]); + if (e) throw e; + if (!this._responseAvailable) { + throw Error.invalidOperation(String.format(Sys.Res.cannotCallBeforeResponse, 'getResponseHeader')); + } + if (!this._xmlHttpRequest) { + throw Error.invalidOperation(String.format(Sys.Res.cannotCallOutsideHandler, 'getResponseHeader')); + } + var result; + try { + result = this._xmlHttpRequest.getResponseHeader(header); + } catch (e) { + } + if (!result) result = ""; + return result; + } + function Sys$Net$XMLHttpExecutor$getAllResponseHeaders() { + /// + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (!this._responseAvailable) { + throw Error.invalidOperation(String.format(Sys.Res.cannotCallBeforeResponse, 'getAllResponseHeaders')); + } + if (!this._xmlHttpRequest) { + throw Error.invalidOperation(String.format(Sys.Res.cannotCallOutsideHandler, 'getAllResponseHeaders')); + } + return this._xmlHttpRequest.getAllResponseHeaders(); + } + function Sys$Net$XMLHttpExecutor$get_responseData() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (!this._responseAvailable) { + throw Error.invalidOperation(String.format(Sys.Res.cannotCallBeforeResponse, 'get_responseData')); + } + if (!this._xmlHttpRequest) { + throw Error.invalidOperation(String.format(Sys.Res.cannotCallOutsideHandler, 'get_responseData')); + } + return this._xmlHttpRequest.responseText; + } + function Sys$Net$XMLHttpExecutor$get_statusCode() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (!this._responseAvailable) { + throw Error.invalidOperation(String.format(Sys.Res.cannotCallBeforeResponse, 'get_statusCode')); + } + if (!this._xmlHttpRequest) { + throw Error.invalidOperation(String.format(Sys.Res.cannotCallOutsideHandler, 'get_statusCode')); + } + var result = 0; + try { + result = this._xmlHttpRequest.status; + } + catch(ex) { + } + return result; + } + function Sys$Net$XMLHttpExecutor$get_statusText() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (!this._responseAvailable) { + throw Error.invalidOperation(String.format(Sys.Res.cannotCallBeforeResponse, 'get_statusText')); + } + if (!this._xmlHttpRequest) { + throw Error.invalidOperation(String.format(Sys.Res.cannotCallOutsideHandler, 'get_statusText')); + } + return this._xmlHttpRequest.statusText; + } + function Sys$Net$XMLHttpExecutor$get_xml() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (!this._responseAvailable) { + throw Error.invalidOperation(String.format(Sys.Res.cannotCallBeforeResponse, 'get_xml')); + } + if (!this._xmlHttpRequest) { + throw Error.invalidOperation(String.format(Sys.Res.cannotCallOutsideHandler, 'get_xml')); + } + var xml = this._xmlHttpRequest.responseXML; + if (!xml || !xml.documentElement) { + xml = Sys.Net.XMLDOM(this._xmlHttpRequest.responseText); + if (!xml || !xml.documentElement) + return null; + } + else if (navigator.userAgent.indexOf('MSIE') !== -1) { + xml.setProperty('SelectionLanguage', 'XPath'); + } + if (xml.documentElement.namespaceURI === "http://www.mozilla.org/newlayout/xml/parsererror.xml" && + xml.documentElement.tagName === "parsererror") { + return null; + } + + if (xml.documentElement.firstChild && xml.documentElement.firstChild.tagName === "parsererror") { + return null; + } + + return xml; + } + function Sys$Net$XMLHttpExecutor$abort() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (!this._started) { + throw Error.invalidOperation(Sys.Res.cannotAbortBeforeStart); + } + if (this._aborted || this._responseAvailable || this._timedOut) + return; + this._aborted = true; + this._clearTimer(); + if (this._xmlHttpRequest && !this._responseAvailable) { + this._xmlHttpRequest.onreadystatechange = Function.emptyMethod; + this._xmlHttpRequest.abort(); + + this._xmlHttpRequest = null; + this._webRequest.completed(Sys.EventArgs.Empty); + } + } +Sys.Net.XMLHttpExecutor.prototype = { + get_timedOut: Sys$Net$XMLHttpExecutor$get_timedOut, + get_started: Sys$Net$XMLHttpExecutor$get_started, + get_responseAvailable: Sys$Net$XMLHttpExecutor$get_responseAvailable, + get_aborted: Sys$Net$XMLHttpExecutor$get_aborted, + executeRequest: Sys$Net$XMLHttpExecutor$executeRequest, + getResponseHeader: Sys$Net$XMLHttpExecutor$getResponseHeader, + getAllResponseHeaders: Sys$Net$XMLHttpExecutor$getAllResponseHeaders, + get_responseData: Sys$Net$XMLHttpExecutor$get_responseData, + get_statusCode: Sys$Net$XMLHttpExecutor$get_statusCode, + get_statusText: Sys$Net$XMLHttpExecutor$get_statusText, + get_xml: Sys$Net$XMLHttpExecutor$get_xml, + abort: Sys$Net$XMLHttpExecutor$abort +} +Sys.Net.XMLHttpExecutor.registerClass('Sys.Net.XMLHttpExecutor', Sys.Net.WebRequestExecutor); + +Sys.Net._WebRequestManager = function Sys$Net$_WebRequestManager() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + this._defaultTimeout = 0; + this._defaultExecutorType = "Sys.Net.XMLHttpExecutor"; +} + function Sys$Net$_WebRequestManager$add_invokingRequest(handler) { + /// + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + this._get_eventHandlerList().addHandler("invokingRequest", handler); + } + function Sys$Net$_WebRequestManager$remove_invokingRequest(handler) { + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + this._get_eventHandlerList().removeHandler("invokingRequest", handler); + } + function Sys$Net$_WebRequestManager$add_completedRequest(handler) { + /// + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + this._get_eventHandlerList().addHandler("completedRequest", handler); + } + function Sys$Net$_WebRequestManager$remove_completedRequest(handler) { + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + this._get_eventHandlerList().removeHandler("completedRequest", handler); + } + function Sys$Net$_WebRequestManager$_get_eventHandlerList() { + if (!this._events) { + this._events = new Sys.EventHandlerList(); + } + return this._events; + } + function Sys$Net$_WebRequestManager$get_defaultTimeout() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._defaultTimeout; + } + function Sys$Net$_WebRequestManager$set_defaultTimeout(value) { + var e = Function._validateParams(arguments, [{name: "value", type: Number}]); + if (e) throw e; + if (value < 0) { + throw Error.argumentOutOfRange("value", value, Sys.Res.invalidTimeout); + } + this._defaultTimeout = value; + } + function Sys$Net$_WebRequestManager$get_defaultExecutorType() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._defaultExecutorType; + } + function Sys$Net$_WebRequestManager$set_defaultExecutorType(value) { + var e = Function._validateParams(arguments, [{name: "value", type: String}]); + if (e) throw e; + this._defaultExecutorType = value; + } + function Sys$Net$_WebRequestManager$executeRequest(webRequest) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "webRequest", type: Sys.Net.WebRequest} + ]); + if (e) throw e; + var executor = webRequest.get_executor(); + if (!executor) { + var failed = false; + try { + var executorType = eval(this._defaultExecutorType); + executor = new executorType(); + } catch (e) { + failed = true; + } + if (failed || !Sys.Net.WebRequestExecutor.isInstanceOfType(executor) || !executor) { + throw Error.argument("defaultExecutorType", String.format(Sys.Res.invalidExecutorType, this._defaultExecutorType)); + } + webRequest.set_executor(executor); + } + if (executor.get_aborted()) { + return; + } + var evArgs = new Sys.Net.NetworkRequestEventArgs(webRequest); + var handler = this._get_eventHandlerList().getHandler("invokingRequest"); + if (handler) { + handler(this, evArgs); + } + if (!evArgs.get_cancel()) { + executor.executeRequest(); + } + } +Sys.Net._WebRequestManager.prototype = { + add_invokingRequest: Sys$Net$_WebRequestManager$add_invokingRequest, + remove_invokingRequest: Sys$Net$_WebRequestManager$remove_invokingRequest, + add_completedRequest: Sys$Net$_WebRequestManager$add_completedRequest, + remove_completedRequest: Sys$Net$_WebRequestManager$remove_completedRequest, + _get_eventHandlerList: Sys$Net$_WebRequestManager$_get_eventHandlerList, + get_defaultTimeout: Sys$Net$_WebRequestManager$get_defaultTimeout, + set_defaultTimeout: Sys$Net$_WebRequestManager$set_defaultTimeout, + get_defaultExecutorType: Sys$Net$_WebRequestManager$get_defaultExecutorType, + set_defaultExecutorType: Sys$Net$_WebRequestManager$set_defaultExecutorType, + executeRequest: Sys$Net$_WebRequestManager$executeRequest +} +Sys.Net._WebRequestManager.registerClass('Sys.Net._WebRequestManager'); +Sys.Net.WebRequestManager = new Sys.Net._WebRequestManager(); + +Sys.Net.NetworkRequestEventArgs = function Sys$Net$NetworkRequestEventArgs(webRequest) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "webRequest", type: Sys.Net.WebRequest} + ]); + if (e) throw e; + Sys.Net.NetworkRequestEventArgs.initializeBase(this); + this._webRequest = webRequest; +} + function Sys$Net$NetworkRequestEventArgs$get_webRequest() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._webRequest; + } +Sys.Net.NetworkRequestEventArgs.prototype = { + get_webRequest: Sys$Net$NetworkRequestEventArgs$get_webRequest +} +Sys.Net.NetworkRequestEventArgs.registerClass('Sys.Net.NetworkRequestEventArgs', Sys.CancelEventArgs); + +Sys.Net.WebRequest = function Sys$Net$WebRequest() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + this._url = ""; + this._headers = { }; + this._body = null; + this._userContext = null; + this._httpVerb = null; + this._executor = null; + this._invokeCalled = false; + this._timeout = 0; +} + function Sys$Net$WebRequest$add_completed(handler) { + /// + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + this._get_eventHandlerList().addHandler("completed", handler); + } + function Sys$Net$WebRequest$remove_completed(handler) { + var e = Function._validateParams(arguments, [{name: "handler", type: Function}]); + if (e) throw e; + this._get_eventHandlerList().removeHandler("completed", handler); + } + function Sys$Net$WebRequest$completed(eventArgs) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "eventArgs", type: Sys.EventArgs} + ]); + if (e) throw e; + var handler = Sys.Net.WebRequestManager._get_eventHandlerList().getHandler("completedRequest"); + if (handler) { + handler(this._executor, eventArgs); + } + handler = this._get_eventHandlerList().getHandler("completed"); + if (handler) { + handler(this._executor, eventArgs); + } + } + function Sys$Net$WebRequest$_get_eventHandlerList() { + if (!this._events) { + this._events = new Sys.EventHandlerList(); + } + return this._events; + } + function Sys$Net$WebRequest$get_url() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._url; + } + function Sys$Net$WebRequest$set_url(value) { + var e = Function._validateParams(arguments, [{name: "value", type: String}]); + if (e) throw e; + this._url = value; + } + function Sys$Net$WebRequest$get_headers() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._headers; + } + function Sys$Net$WebRequest$get_httpVerb() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (this._httpVerb === null) { + if (this._body === null) { + return "GET"; + } + return "POST"; + } + return this._httpVerb; + } + function Sys$Net$WebRequest$set_httpVerb(value) { + var e = Function._validateParams(arguments, [{name: "value", type: String}]); + if (e) throw e; + if (value.length === 0) { + throw Error.argument('value', Sys.Res.invalidHttpVerb); + } + this._httpVerb = value; + } + function Sys$Net$WebRequest$get_body() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._body; + } + function Sys$Net$WebRequest$set_body(value) { + var e = Function._validateParams(arguments, [{name: "value", mayBeNull: true}]); + if (e) throw e; + this._body = value; + } + function Sys$Net$WebRequest$get_userContext() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._userContext; + } + function Sys$Net$WebRequest$set_userContext(value) { + var e = Function._validateParams(arguments, [{name: "value", mayBeNull: true}]); + if (e) throw e; + this._userContext = value; + } + function Sys$Net$WebRequest$get_executor() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._executor; + } + function Sys$Net$WebRequest$set_executor(value) { + var e = Function._validateParams(arguments, [{name: "value", type: Sys.Net.WebRequestExecutor}]); + if (e) throw e; + if (this._executor !== null && this._executor.get_started()) { + throw Error.invalidOperation(Sys.Res.setExecutorAfterActive); + } + this._executor = value; + this._executor._set_webRequest(this); + } + function Sys$Net$WebRequest$get_timeout() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (this._timeout === 0) { + return Sys.Net.WebRequestManager.get_defaultTimeout(); + } + return this._timeout; + } + function Sys$Net$WebRequest$set_timeout(value) { + var e = Function._validateParams(arguments, [{name: "value", type: Number}]); + if (e) throw e; + if (value < 0) { + throw Error.argumentOutOfRange("value", value, Sys.Res.invalidTimeout); + } + this._timeout = value; + } + function Sys$Net$WebRequest$getResolvedUrl() { + /// + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return Sys.Net.WebRequest._resolveUrl(this._url); + } + function Sys$Net$WebRequest$invoke() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (this._invokeCalled) { + throw Error.invalidOperation(Sys.Res.invokeCalledTwice); + } + Sys.Net.WebRequestManager.executeRequest(this); + this._invokeCalled = true; + } +Sys.Net.WebRequest.prototype = { + add_completed: Sys$Net$WebRequest$add_completed, + remove_completed: Sys$Net$WebRequest$remove_completed, + completed: Sys$Net$WebRequest$completed, + _get_eventHandlerList: Sys$Net$WebRequest$_get_eventHandlerList, + get_url: Sys$Net$WebRequest$get_url, + set_url: Sys$Net$WebRequest$set_url, + get_headers: Sys$Net$WebRequest$get_headers, + get_httpVerb: Sys$Net$WebRequest$get_httpVerb, + set_httpVerb: Sys$Net$WebRequest$set_httpVerb, + get_body: Sys$Net$WebRequest$get_body, + set_body: Sys$Net$WebRequest$set_body, + get_userContext: Sys$Net$WebRequest$get_userContext, + set_userContext: Sys$Net$WebRequest$set_userContext, + get_executor: Sys$Net$WebRequest$get_executor, + set_executor: Sys$Net$WebRequest$set_executor, + get_timeout: Sys$Net$WebRequest$get_timeout, + set_timeout: Sys$Net$WebRequest$set_timeout, + getResolvedUrl: Sys$Net$WebRequest$getResolvedUrl, + invoke: Sys$Net$WebRequest$invoke +} +Sys.Net.WebRequest._resolveUrl = function Sys$Net$WebRequest$_resolveUrl(url, baseUrl) { + if (url && url.indexOf('://') !== -1) { + return url; + } + if (!baseUrl || baseUrl.length === 0) { + var baseElement = document.getElementsByTagName('base')[0]; + if (baseElement && baseElement.href && baseElement.href.length > 0) { + baseUrl = baseElement.href; + } + else { + baseUrl = document.URL; + } + } + var qsStart = baseUrl.indexOf('?'); + if (qsStart !== -1) { + baseUrl = baseUrl.substr(0, qsStart); + } + qsStart = baseUrl.indexOf('#'); + if (qsStart !== -1) { + baseUrl = baseUrl.substr(0, qsStart); + } + baseUrl = baseUrl.substr(0, baseUrl.lastIndexOf('/') + 1); + if (!url || url.length === 0) { + return baseUrl; + } + if (url.charAt(0) === '/') { + var slashslash = baseUrl.indexOf('://'); + if (slashslash === -1) { + throw Error.argument("baseUrl", Sys.Res.badBaseUrl1); + } + var nextSlash = baseUrl.indexOf('/', slashslash + 3); + if (nextSlash === -1) { + throw Error.argument("baseUrl", Sys.Res.badBaseUrl2); + } + return baseUrl.substr(0, nextSlash) + url; + } + else { + var lastSlash = baseUrl.lastIndexOf('/'); + if (lastSlash === -1) { + throw Error.argument("baseUrl", Sys.Res.badBaseUrl3); + } + return baseUrl.substr(0, lastSlash+1) + url; + } +} +Sys.Net.WebRequest._createQueryString = function Sys$Net$WebRequest$_createQueryString(queryString, encodeMethod) { + if (!encodeMethod) + encodeMethod = encodeURIComponent; + var sb = new Sys.StringBuilder(); + var i = 0; + for (var arg in queryString) { + var obj = queryString[arg]; + if (typeof(obj) === "function") continue; + var val = Sys.Serialization.JavaScriptSerializer.serialize(obj); + if (i !== 0) { + sb.append('&'); + } + sb.append(arg); + sb.append('='); + sb.append(encodeMethod(val)); + i++; + } + return sb.toString(); +} +Sys.Net.WebRequest._createUrl = function Sys$Net$WebRequest$_createUrl(url, queryString) { + if (!queryString) { + return url; + } + var qs = Sys.Net.WebRequest._createQueryString(queryString); + if (qs.length > 0) { + var sep = '?'; + if (url && url.indexOf('?') !== -1) + sep = '&'; + return url + sep + qs; + } else { + return url; + } +} +Sys.Net.WebRequest.registerClass('Sys.Net.WebRequest'); + +Sys.Net.WebServiceProxy = function Sys$Net$WebServiceProxy() { +} + function Sys$Net$WebServiceProxy$get_timeout() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._timeout; + } + function Sys$Net$WebServiceProxy$set_timeout(value) { + var e = Function._validateParams(arguments, [{name: "value", type: Number}]); + if (e) throw e; + if (value < 0) { throw Error.argumentOutOfRange('value', value, Sys.Res.invalidTimeout); } + this._timeout = value; + } + function Sys$Net$WebServiceProxy$get_defaultUserContext() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._userContext; + } + function Sys$Net$WebServiceProxy$set_defaultUserContext(value) { + var e = Function._validateParams(arguments, [{name: "value", mayBeNull: true}]); + if (e) throw e; + this._userContext = value; + } + function Sys$Net$WebServiceProxy$get_defaultSucceededCallback() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._succeeded; + } + function Sys$Net$WebServiceProxy$set_defaultSucceededCallback(value) { + var e = Function._validateParams(arguments, [{name: "value", type: Function, mayBeNull: true}]); + if (e) throw e; + this._succeeded = value; + } + function Sys$Net$WebServiceProxy$get_defaultFailedCallback() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._failed; + } + function Sys$Net$WebServiceProxy$set_defaultFailedCallback(value) { + var e = Function._validateParams(arguments, [{name: "value", type: Function, mayBeNull: true}]); + if (e) throw e; + this._failed = value; + } + function Sys$Net$WebServiceProxy$get_path() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._path; + } + function Sys$Net$WebServiceProxy$set_path(value) { + var e = Function._validateParams(arguments, [{name: "value", type: String}]); + if (e) throw e; + this._path = value; + } + function Sys$Net$WebServiceProxy$_invoke(servicePath, methodName, useGet, params, onSuccess, onFailure, userContext) { + /// + /// + /// + /// + /// + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "servicePath", type: String}, + {name: "methodName", type: String}, + {name: "useGet", type: Boolean}, + {name: "params"}, + {name: "onSuccess", type: Function, mayBeNull: true, optional: true}, + {name: "onFailure", type: Function, mayBeNull: true, optional: true}, + {name: "userContext", mayBeNull: true, optional: true} + ]); + if (e) throw e; + if (onSuccess === null || typeof onSuccess === 'undefined') onSuccess = this.get_defaultSucceededCallback(); + if (onFailure === null || typeof onFailure === 'undefined') onFailure = this.get_defaultFailedCallback(); + if (userContext === null || typeof userContext === 'undefined') userContext = this.get_defaultUserContext(); + + return Sys.Net.WebServiceProxy.invoke(servicePath, methodName, useGet, params, onSuccess, onFailure, userContext, this.get_timeout()); + } +Sys.Net.WebServiceProxy.prototype = { + get_timeout: Sys$Net$WebServiceProxy$get_timeout, + set_timeout: Sys$Net$WebServiceProxy$set_timeout, + get_defaultUserContext: Sys$Net$WebServiceProxy$get_defaultUserContext, + set_defaultUserContext: Sys$Net$WebServiceProxy$set_defaultUserContext, + get_defaultSucceededCallback: Sys$Net$WebServiceProxy$get_defaultSucceededCallback, + set_defaultSucceededCallback: Sys$Net$WebServiceProxy$set_defaultSucceededCallback, + get_defaultFailedCallback: Sys$Net$WebServiceProxy$get_defaultFailedCallback, + set_defaultFailedCallback: Sys$Net$WebServiceProxy$set_defaultFailedCallback, + get_path: Sys$Net$WebServiceProxy$get_path, + set_path: Sys$Net$WebServiceProxy$set_path, + _invoke: Sys$Net$WebServiceProxy$_invoke +} +Sys.Net.WebServiceProxy.registerClass('Sys.Net.WebServiceProxy'); +Sys.Net.WebServiceProxy.invoke = function Sys$Net$WebServiceProxy$invoke(servicePath, methodName, useGet, params, onSuccess, onFailure, userContext, timeout) { + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "servicePath", type: String}, + {name: "methodName", type: String}, + {name: "useGet", type: Boolean, optional: true}, + {name: "params", mayBeNull: true, optional: true}, + {name: "onSuccess", type: Function, mayBeNull: true, optional: true}, + {name: "onFailure", type: Function, mayBeNull: true, optional: true}, + {name: "userContext", mayBeNull: true, optional: true}, + {name: "timeout", type: Number, optional: true} + ]); + if (e) throw e; + var request = new Sys.Net.WebRequest(); + request.get_headers()['Content-Type'] = 'application/json; charset=utf-8'; + if (!params) params = {}; + var urlParams = params; + if (!useGet || !urlParams) urlParams = {}; + request.set_url(Sys.Net.WebRequest._createUrl(servicePath+"/"+encodeURIComponent(methodName), urlParams)); + var body = null; + if (!useGet) { + body = Sys.Serialization.JavaScriptSerializer.serialize(params); + if (body === "{}") body = ""; + } + request.set_body(body); + request.add_completed(onComplete); + if (timeout && timeout > 0) request.set_timeout(timeout); + request.invoke(); + function onComplete(response, eventArgs) { + if (response.get_responseAvailable()) { + var statusCode = response.get_statusCode(); + var result = null; + + try { + var contentType = response.getResponseHeader("Content-Type"); + if (contentType.startsWith("application/json")) { + result = response.get_object(); + } + else if (contentType.startsWith("text/xml")) { + result = response.get_xml(); + } + else { + result = response.get_responseData(); + } + } catch (ex) { + } + var error = response.getResponseHeader("jsonerror"); + var errorObj = (error === "true"); + if (errorObj) { + if (result) { + result = new Sys.Net.WebServiceError(false, result.Message, result.StackTrace, result.ExceptionType); + } + } + else if (contentType.startsWith("application/json")) { + if (!result || typeof(result.d) === "undefined") { + throw Sys.Net.WebServiceProxy._createFailedError(methodName, String.format(Sys.Res.webServiceInvalidJsonWrapper, methodName)); + } + result = result.d; + } + if (((statusCode < 200) || (statusCode >= 300)) || errorObj) { + if (onFailure) { + if (!result || !errorObj) { + result = new Sys.Net.WebServiceError(false , String.format(Sys.Res.webServiceFailedNoMsg, methodName), "", ""); + } + result._statusCode = statusCode; + onFailure(result, userContext, methodName); + } + else { + var error; + if (result && errorObj) { + error = result.get_exceptionType() + "-- " + result.get_message(); + } + else { + error = response.get_responseData(); + } + throw Sys.Net.WebServiceProxy._createFailedError(methodName, String.format(Sys.Res.webServiceFailed, methodName, error)); + } + } + else if (onSuccess) { + onSuccess(result, userContext, methodName); + } + } + else { + var msg; + if (response.get_timedOut()) { + msg = String.format(Sys.Res.webServiceTimedOut, methodName); + } + else { + msg = String.format(Sys.Res.webServiceFailedNoMsg, methodName) + } + if (onFailure) { + onFailure(new Sys.Net.WebServiceError(response.get_timedOut(), msg, "", ""), userContext, methodName); + } + else { + throw Sys.Net.WebServiceProxy._createFailedError(methodName, msg); + } + } + } + return request; +} +Sys.Net.WebServiceProxy._createFailedError = function Sys$Net$WebServiceProxy$_createFailedError(methodName, errorMessage) { + var displayMessage = "Sys.Net.WebServiceFailedException: " + errorMessage; + var e = Error.create(displayMessage, { 'name': 'Sys.Net.WebServiceFailedException', 'methodName': methodName }); + e.popStackFrame(); + return e; +} +Sys.Net.WebServiceProxy._defaultFailedCallback = function Sys$Net$WebServiceProxy$_defaultFailedCallback(err, methodName) { + var error = err.get_exceptionType() + "-- " + err.get_message(); + throw Sys.Net.WebServiceProxy._createFailedError(methodName, String.format(Sys.Res.webServiceFailed, methodName, error)); +} +Sys.Net.WebServiceProxy._generateTypedConstructor = function Sys$Net$WebServiceProxy$_generateTypedConstructor(type) { + return function(properties) { + if (properties) { + for (var name in properties) { + this[name] = properties[name]; + } + } + this.__type = type; + } +} + +Sys.Net.WebServiceError = function Sys$Net$WebServiceError(timedOut, message, stackTrace, exceptionType) { + /// + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "timedOut", type: Boolean}, + {name: "message", type: String, mayBeNull: true}, + {name: "stackTrace", type: String, mayBeNull: true}, + {name: "exceptionType", type: String, mayBeNull: true} + ]); + if (e) throw e; + this._timedOut = timedOut; + this._message = message; + this._stackTrace = stackTrace; + this._exceptionType = exceptionType; + this._statusCode = -1; +} + function Sys$Net$WebServiceError$get_timedOut() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._timedOut; + } + function Sys$Net$WebServiceError$get_statusCode() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._statusCode; + } + function Sys$Net$WebServiceError$get_message() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._message; + } + function Sys$Net$WebServiceError$get_stackTrace() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._stackTrace; + } + function Sys$Net$WebServiceError$get_exceptionType() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._exceptionType; + } +Sys.Net.WebServiceError.prototype = { + get_timedOut: Sys$Net$WebServiceError$get_timedOut, + get_statusCode: Sys$Net$WebServiceError$get_statusCode, + get_message: Sys$Net$WebServiceError$get_message, + get_stackTrace: Sys$Net$WebServiceError$get_stackTrace, + get_exceptionType: Sys$Net$WebServiceError$get_exceptionType +} +Sys.Net.WebServiceError.registerClass('Sys.Net.WebServiceError'); +Type.registerNamespace('Sys.Services'); +Sys.Services._ProfileService = function Sys$Services$_ProfileService() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + Sys.Services._ProfileService.initializeBase(this); + this.properties = {}; +} +Sys.Services._ProfileService.DefaultWebServicePath = ''; + function Sys$Services$_ProfileService$get_defaultLoadCompletedCallback() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._defaultLoadCompletedCallback; + } + function Sys$Services$_ProfileService$set_defaultLoadCompletedCallback(value) { + var e = Function._validateParams(arguments, [{name: "value", type: Function, mayBeNull: true}]); + if (e) throw e; + this._defaultLoadCompletedCallback = value; + } + function Sys$Services$_ProfileService$get_defaultSaveCompletedCallback() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._defaultSaveCompletedCallback; + } + function Sys$Services$_ProfileService$set_defaultSaveCompletedCallback(value) { + var e = Function._validateParams(arguments, [{name: "value", type: Function, mayBeNull: true}]); + if (e) throw e; + this._defaultSaveCompletedCallback = value; + } + function Sys$Services$_ProfileService$get_path() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._path || ''; + } + function Sys$Services$_ProfileService$load(propertyNames, loadCompletedCallback, failedCallback, userContext) { + /// + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "propertyNames", type: Array, mayBeNull: true, optional: true, elementType: String}, + {name: "loadCompletedCallback", type: Function, mayBeNull: true, optional: true}, + {name: "failedCallback", type: Function, mayBeNull: true, optional: true}, + {name: "userContext", mayBeNull: true, optional: true} + ]); + if (e) throw e; + var parameters; + var methodName; + if (!propertyNames) { + methodName = "GetAllPropertiesForCurrentUser"; + parameters = { authenticatedUserOnly: false }; + } + else { + methodName = "GetPropertiesForCurrentUser"; + parameters = { properties: this._clonePropertyNames(propertyNames), authenticatedUserOnly: false }; + } + this._invoke(this._get_path(), + methodName, + false, + parameters, + Function.createDelegate(this, this._onLoadComplete), + Function.createDelegate(this, this._onLoadFailed), + [loadCompletedCallback, failedCallback, userContext]); + } + function Sys$Services$_ProfileService$save(propertyNames, saveCompletedCallback, failedCallback, userContext) { + /// + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "propertyNames", type: Array, mayBeNull: true, optional: true, elementType: String}, + {name: "saveCompletedCallback", type: Function, mayBeNull: true, optional: true}, + {name: "failedCallback", type: Function, mayBeNull: true, optional: true}, + {name: "userContext", mayBeNull: true, optional: true} + ]); + if (e) throw e; + var flattenedProperties = this._flattenProperties(propertyNames, this.properties); + this._invoke(this._get_path(), + "SetPropertiesForCurrentUser", + false, + { values: flattenedProperties.value, authenticatedUserOnly: false }, + Function.createDelegate(this, this._onSaveComplete), + Function.createDelegate(this, this._onSaveFailed), + [saveCompletedCallback, failedCallback, userContext, flattenedProperties.count]); + } + function Sys$Services$_ProfileService$_clonePropertyNames(arr) { + var nodups = []; + var seen = {}; + for (var i=0; i < arr.length; i++) { + var prop = arr[i]; + if(!seen[prop]) { Array.add(nodups, prop); seen[prop]=true; }; + } + return nodups; + } + function Sys$Services$_ProfileService$_flattenProperties(propertyNames, properties, groupName) { + var flattenedProperties = {}; + var val; + var key; + var count = 0; + if (propertyNames && propertyNames.length === 0) { + return { value: flattenedProperties, count: 0 }; + } + for (var property in properties) { + val = properties[property]; + key = groupName ? groupName + "." + property : property; + if(Sys.Services.ProfileGroup.isInstanceOfType(val)) { + var obj = this._flattenProperties(propertyNames, val, key); + var groupProperties = obj.value; + count += obj.count; + for(var subKey in groupProperties) { + var subVal = groupProperties[subKey]; + flattenedProperties[subKey] = subVal; + } + } + else { + if(!propertyNames || Array.indexOf(propertyNames, key) !== -1) { + flattenedProperties[key] = val; + count++; + } + } + } + return { value: flattenedProperties, count: count }; + } + function Sys$Services$_ProfileService$_get_path() { + var path = this.get_path(); + if (!path.length) { + path = Sys.Services._ProfileService.DefaultWebServicePath; + } + if (!path || !path.length) { + throw Error.invalidOperation(Sys.Res.servicePathNotSet); + } + return path; + } + function Sys$Services$_ProfileService$_onLoadComplete(result, context, methodName) { + if (typeof(result) !== "object") { + throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType, methodName, "Object")); + } + var unflattened = this._unflattenProperties(result); + for (var name in unflattened) { + this.properties[name] = unflattened[name]; + } + + var callback = context[0] || this.get_defaultLoadCompletedCallback() || this.get_defaultSucceededCallback(); + if (callback) { + var userContext = context[2] || this.get_defaultUserContext(); + callback(result.length, userContext, "Sys.Services.ProfileService.load"); + } + } + function Sys$Services$_ProfileService$_onLoadFailed(err, context, methodName) { + var callback = context[1] || this.get_defaultFailedCallback(); + if (callback) { + var userContext = context[2] || this.get_defaultUserContext(); + callback(err, userContext, "Sys.Services.ProfileService.load"); + } + else { + Sys.Net.WebServiceProxy._defaultFailedCallback(err, methodName); + } + } + function Sys$Services$_ProfileService$_onSaveComplete(result, context, methodName) { + var count = context[3]; + if (result !== null) { + if (result instanceof Array) { + count -= result.length; + } + else if (typeof(result) === 'number') { + count = result; + } + else { + throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType, methodName, "Array")); + } + } + + var callback = context[0] || this.get_defaultSaveCompletedCallback() || this.get_defaultSucceededCallback(); + if (callback) { + var userContext = context[2] || this.get_defaultUserContext(); + callback(count, userContext, "Sys.Services.ProfileService.save"); + } + } + function Sys$Services$_ProfileService$_onSaveFailed(err, context, methodName) { + var callback = context[1] || this.get_defaultFailedCallback(); + if (callback) { + var userContext = context[2] || this.get_defaultUserContext(); + callback(err, userContext, "Sys.Services.ProfileService.save"); + } + else { + Sys.Net.WebServiceProxy._defaultFailedCallback(err, methodName); + } + } + function Sys$Services$_ProfileService$_unflattenProperties(properties) { + var unflattenedProperties = {}; + var dotIndex; + var val; + var count = 0; + for (var key in properties) { + count++; + val = properties[key]; + dotIndex = key.indexOf('.'); + if (dotIndex !== -1) { + var groupName = key.substr(0, dotIndex); + key = key.substr(dotIndex+1); + var group = unflattenedProperties[groupName]; + if (!group || !Sys.Services.ProfileGroup.isInstanceOfType(group)) { + group = new Sys.Services.ProfileGroup(); + unflattenedProperties[groupName] = group; + } + group[key] = val; + } + else { + unflattenedProperties[key] = val; + } + } + properties.length = count; + return unflattenedProperties; + } +Sys.Services._ProfileService.prototype = { + _defaultLoadCompletedCallback: null, + _defaultSaveCompletedCallback: null, + _path: '', + _timeout: 0, + get_defaultLoadCompletedCallback: Sys$Services$_ProfileService$get_defaultLoadCompletedCallback, + set_defaultLoadCompletedCallback: Sys$Services$_ProfileService$set_defaultLoadCompletedCallback, + get_defaultSaveCompletedCallback: Sys$Services$_ProfileService$get_defaultSaveCompletedCallback, + set_defaultSaveCompletedCallback: Sys$Services$_ProfileService$set_defaultSaveCompletedCallback, + get_path: Sys$Services$_ProfileService$get_path, + load: Sys$Services$_ProfileService$load, + save: Sys$Services$_ProfileService$save, + _clonePropertyNames: Sys$Services$_ProfileService$_clonePropertyNames, + _flattenProperties: Sys$Services$_ProfileService$_flattenProperties, + _get_path: Sys$Services$_ProfileService$_get_path, + _onLoadComplete: Sys$Services$_ProfileService$_onLoadComplete, + _onLoadFailed: Sys$Services$_ProfileService$_onLoadFailed, + _onSaveComplete: Sys$Services$_ProfileService$_onSaveComplete, + _onSaveFailed: Sys$Services$_ProfileService$_onSaveFailed, + _unflattenProperties: Sys$Services$_ProfileService$_unflattenProperties +} +Sys.Services._ProfileService.registerClass('Sys.Services._ProfileService', Sys.Net.WebServiceProxy); +Sys.Services.ProfileService = new Sys.Services._ProfileService(); +Sys.Services.ProfileGroup = function Sys$Services$ProfileGroup(properties) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "properties", mayBeNull: true, optional: true} + ]); + if (e) throw e; + if (properties) { + for (var property in properties) { + this[property] = properties[property]; + } + } +} +Sys.Services.ProfileGroup.registerClass('Sys.Services.ProfileGroup'); +Sys.Services._AuthenticationService = function Sys$Services$_AuthenticationService() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + Sys.Services._AuthenticationService.initializeBase(this); +} +Sys.Services._AuthenticationService.DefaultWebServicePath = ''; + function Sys$Services$_AuthenticationService$get_defaultLoginCompletedCallback() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._defaultLoginCompletedCallback; + } + function Sys$Services$_AuthenticationService$set_defaultLoginCompletedCallback(value) { + var e = Function._validateParams(arguments, [{name: "value", type: Function, mayBeNull: true}]); + if (e) throw e; + this._defaultLoginCompletedCallback = value; + } + function Sys$Services$_AuthenticationService$get_defaultLogoutCompletedCallback() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._defaultLogoutCompletedCallback; + } + function Sys$Services$_AuthenticationService$set_defaultLogoutCompletedCallback(value) { + var e = Function._validateParams(arguments, [{name: "value", type: Function, mayBeNull: true}]); + if (e) throw e; + this._defaultLogoutCompletedCallback = value; + } + function Sys$Services$_AuthenticationService$get_isLoggedIn() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._authenticated; + } + function Sys$Services$_AuthenticationService$get_path() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._path || ''; + } + function Sys$Services$_AuthenticationService$login(username, password, isPersistent, customInfo, redirectUrl, loginCompletedCallback, failedCallback, userContext) { + /// + /// + /// + /// + /// + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "username", type: String}, + {name: "password", type: String, mayBeNull: true}, + {name: "isPersistent", type: Boolean, mayBeNull: true, optional: true}, + {name: "customInfo", type: String, mayBeNull: true, optional: true}, + {name: "redirectUrl", type: String, mayBeNull: true, optional: true}, + {name: "loginCompletedCallback", type: Function, mayBeNull: true, optional: true}, + {name: "failedCallback", type: Function, mayBeNull: true, optional: true}, + {name: "userContext", mayBeNull: true, optional: true} + ]); + if (e) throw e; + this._invoke(this._get_path(), "Login", false, + { userName: username, password: password, createPersistentCookie: isPersistent }, + Function.createDelegate(this, this._onLoginComplete), + Function.createDelegate(this, this._onLoginFailed), + [username, password, isPersistent, customInfo, redirectUrl, loginCompletedCallback, failedCallback, userContext]); + } + function Sys$Services$_AuthenticationService$logout(redirectUrl, logoutCompletedCallback, failedCallback, userContext) { + /// + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "redirectUrl", type: String, mayBeNull: true, optional: true}, + {name: "logoutCompletedCallback", type: Function, mayBeNull: true, optional: true}, + {name: "failedCallback", type: Function, mayBeNull: true, optional: true}, + {name: "userContext", mayBeNull: true, optional: true} + ]); + if (e) throw e; + this._invoke(this._get_path(), "Logout", false, {}, + Function.createDelegate(this, this._onLogoutComplete), + Function.createDelegate(this, this._onLogoutFailed), + [redirectUrl, logoutCompletedCallback, failedCallback, userContext]); + } + function Sys$Services$_AuthenticationService$_get_path() { + var path = this.get_path(); + if(!path.length) { + path = Sys.Services._AuthenticationService.DefaultWebServicePath; + } + if(!path || !path.length) { + throw Error.invalidOperation(Sys.Res.servicePathNotSet); + } + return path; + } + function Sys$Services$_AuthenticationService$_onLoginComplete(result, context, methodName) { + if(typeof(result) !== "boolean") { + throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType, methodName, "Boolean")); + } + + var redirectUrl = context[4]; + var userContext = context[7] || this.get_defaultUserContext(); + var callback = context[5] || this.get_defaultLoginCompletedCallback() || this.get_defaultSucceededCallback(); + + if(result) { + this._authenticated = true; + if (callback) { + callback(true, userContext, "Sys.Services.AuthenticationService.login"); + } + + if (typeof(redirectUrl) !== "undefined" && redirectUrl !== null) { + window.location.href = redirectUrl; + } + } + else if (callback) { + callback(false, userContext, "Sys.Services.AuthenticationService.login"); + } + } + function Sys$Services$_AuthenticationService$_onLoginFailed(err, context, methodName) { + var callback = context[6] || this.get_defaultFailedCallback(); + if (callback) { + var userContext = context[7] || this.get_defaultUserContext(); + callback(err, userContext, "Sys.Services.AuthenticationService.login"); + } + else { + Sys.Net.WebServiceProxy._defaultFailedCallback(err, methodName); + } + } + function Sys$Services$_AuthenticationService$_onLogoutComplete(result, context, methodName) { + if(result !== null) { + throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType, methodName, "null")); + } + + var redirectUrl = context[0]; + var userContext = context[3] || this.get_defaultUserContext(); + var callback = context[1] || this.get_defaultLogoutCompletedCallback() || this.get_defaultSucceededCallback(); + this._authenticated = false; + + if (callback) { + callback(null, userContext, "Sys.Services.AuthenticationService.logout"); + } + + if(!redirectUrl) { + window.location.reload(); + } + else { + window.location.href = redirectUrl; + } + } + function Sys$Services$_AuthenticationService$_onLogoutFailed(err, context, methodName) { + var callback = context[2] || this.get_defaultFailedCallback(); + if (callback) { + callback(err, context[3], "Sys.Services.AuthenticationService.logout"); + } + else { + Sys.Net.WebServiceProxy._defaultFailedCallback(err, methodName); + } + } + function Sys$Services$_AuthenticationService$_setAuthenticated(authenticated) { + this._authenticated = authenticated; + } +Sys.Services._AuthenticationService.prototype = { + _defaultLoginCompletedCallback: null, + _defaultLogoutCompletedCallback: null, + _path: '', + _timeout: 0, + _authenticated: false, + get_defaultLoginCompletedCallback: Sys$Services$_AuthenticationService$get_defaultLoginCompletedCallback, + set_defaultLoginCompletedCallback: Sys$Services$_AuthenticationService$set_defaultLoginCompletedCallback, + get_defaultLogoutCompletedCallback: Sys$Services$_AuthenticationService$get_defaultLogoutCompletedCallback, + set_defaultLogoutCompletedCallback: Sys$Services$_AuthenticationService$set_defaultLogoutCompletedCallback, + get_isLoggedIn: Sys$Services$_AuthenticationService$get_isLoggedIn, + get_path: Sys$Services$_AuthenticationService$get_path, + login: Sys$Services$_AuthenticationService$login, + logout: Sys$Services$_AuthenticationService$logout, + _get_path: Sys$Services$_AuthenticationService$_get_path, + _onLoginComplete: Sys$Services$_AuthenticationService$_onLoginComplete, + _onLoginFailed: Sys$Services$_AuthenticationService$_onLoginFailed, + _onLogoutComplete: Sys$Services$_AuthenticationService$_onLogoutComplete, + _onLogoutFailed: Sys$Services$_AuthenticationService$_onLogoutFailed, + _setAuthenticated: Sys$Services$_AuthenticationService$_setAuthenticated +} +Sys.Services._AuthenticationService.registerClass('Sys.Services._AuthenticationService', Sys.Net.WebServiceProxy); +Sys.Services.AuthenticationService = new Sys.Services._AuthenticationService(); +Sys.Services._RoleService = function Sys$Services$_RoleService() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + Sys.Services._RoleService.initializeBase(this); + this._roles = []; +} +Sys.Services._RoleService.DefaultWebServicePath = ''; + function Sys$Services$_RoleService$get_defaultLoadCompletedCallback() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._defaultLoadCompletedCallback; + } + function Sys$Services$_RoleService$set_defaultLoadCompletedCallback(value) { + var e = Function._validateParams(arguments, [{name: "value", type: Function, mayBeNull: true}]); + if (e) throw e; + this._defaultLoadCompletedCallback = value; + } + function Sys$Services$_RoleService$get_path() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._path || ''; + } + function Sys$Services$_RoleService$get_roles() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return Array.clone(this._roles); + } + function Sys$Services$_RoleService$isUserInRole(role) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "role", type: String} + ]); + if (e) throw e; + var v = this._get_rolesIndex()[role.trim().toLowerCase()]; + return !!v; + } + function Sys$Services$_RoleService$load(loadCompletedCallback, failedCallback, userContext) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "loadCompletedCallback", type: Function, mayBeNull: true, optional: true}, + {name: "failedCallback", type: Function, mayBeNull: true, optional: true}, + {name: "userContext", mayBeNull: true, optional: true} + ]); + if (e) throw e; + Sys.Net.WebServiceProxy.invoke( + this._get_path(), + "GetRolesForCurrentUser", + false, + {} , + Function.createDelegate(this, this._onLoadComplete), + Function.createDelegate(this, this._onLoadFailed), + [loadCompletedCallback, failedCallback, userContext], + this.get_timeout()); + } + function Sys$Services$_RoleService$_get_path() { + var path = this.get_path(); + if(!path || !path.length) { + path = Sys.Services._RoleService.DefaultWebServicePath; + } + if(!path || !path.length) { + throw Error.invalidOperation(Sys.Res.servicePathNotSet); + } + return path; + } + function Sys$Services$_RoleService$_get_rolesIndex() { + if (!this._rolesIndex) { + var index = {}; + for(var i=0; i < this._roles.length; i++) { + index[this._roles[i].toLowerCase()] = true; + } + this._rolesIndex = index; + } + return this._rolesIndex; + } + function Sys$Services$_RoleService$_onLoadComplete(result, context, methodName) { + if(result && !(result instanceof Array)) { + throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType, methodName, "Array")); + } + this._roles = result; + this._rolesIndex = null; + var callback = context[0] || this.get_defaultLoadCompletedCallback() || this.get_defaultSucceededCallback(); + if (callback) { + var userContext = context[2] || this.get_defaultUserContext(); + var clonedResult = Array.clone(result); + callback(clonedResult, userContext, "Sys.Services.RoleService.load"); + } + } + function Sys$Services$_RoleService$_onLoadFailed(err, context, methodName) { + var callback = context[1] || this.get_defaultFailedCallback(); + if (callback) { + var userContext = context[2] || this.get_defaultUserContext(); + callback(err, userContext, "Sys.Services.RoleService.load"); + } + else { + Sys.Net.WebServiceProxy._defaultFailedCallback(err, methodName); + } + } +Sys.Services._RoleService.prototype = { + _defaultLoadCompletedCallback: null, + _rolesIndex: null, + _timeout: 0, + _path: '', + get_defaultLoadCompletedCallback: Sys$Services$_RoleService$get_defaultLoadCompletedCallback, + set_defaultLoadCompletedCallback: Sys$Services$_RoleService$set_defaultLoadCompletedCallback, + get_path: Sys$Services$_RoleService$get_path, + get_roles: Sys$Services$_RoleService$get_roles, + isUserInRole: Sys$Services$_RoleService$isUserInRole, + load: Sys$Services$_RoleService$load, + _get_path: Sys$Services$_RoleService$_get_path, + _get_rolesIndex: Sys$Services$_RoleService$_get_rolesIndex, + _onLoadComplete: Sys$Services$_RoleService$_onLoadComplete, + _onLoadFailed: Sys$Services$_RoleService$_onLoadFailed +} +Sys.Services._RoleService.registerClass('Sys.Services._RoleService', Sys.Net.WebServiceProxy); +Sys.Services.RoleService = new Sys.Services._RoleService(); +Type.registerNamespace('Sys.Serialization'); +Sys.Serialization.JavaScriptSerializer = function Sys$Serialization$JavaScriptSerializer() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); +} +Sys.Serialization.JavaScriptSerializer.registerClass('Sys.Serialization.JavaScriptSerializer'); +Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs = []; +Sys.Serialization.JavaScriptSerializer._charsToEscape = []; +Sys.Serialization.JavaScriptSerializer._dateRegEx = new RegExp('(^|[^\\\\])\\"\\\\/Date\\((-?[0-9]+)(?:[a-zA-Z]|(?:\\+|-)[0-9]{4})?\\)\\\\/\\"', 'g'); +Sys.Serialization.JavaScriptSerializer._escapeChars = {}; +Sys.Serialization.JavaScriptSerializer._escapeRegEx = new RegExp('["\\\\\\x00-\\x1F]', 'i'); +Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal = new RegExp('["\\\\\\x00-\\x1F]', 'g'); +Sys.Serialization.JavaScriptSerializer._jsonRegEx = new RegExp('[^,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]', 'g'); +Sys.Serialization.JavaScriptSerializer._jsonStringRegEx = new RegExp('"(\\\\.|[^"\\\\])*"', 'g'); +Sys.Serialization.JavaScriptSerializer._serverTypeFieldName = '__type'; +Sys.Serialization.JavaScriptSerializer._init = function Sys$Serialization$JavaScriptSerializer$_init() { + var replaceChars = ['\\u0000','\\u0001','\\u0002','\\u0003','\\u0004','\\u0005','\\u0006','\\u0007', + '\\b','\\t','\\n','\\u000b','\\f','\\r','\\u000e','\\u000f','\\u0010','\\u0011', + '\\u0012','\\u0013','\\u0014','\\u0015','\\u0016','\\u0017','\\u0018','\\u0019', + '\\u001a','\\u001b','\\u001c','\\u001d','\\u001e','\\u001f']; + Sys.Serialization.JavaScriptSerializer._charsToEscape[0] = '\\'; + Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs['\\'] = new RegExp('\\\\', 'g'); + Sys.Serialization.JavaScriptSerializer._escapeChars['\\'] = '\\\\'; + Sys.Serialization.JavaScriptSerializer._charsToEscape[1] = '"'; + Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs['"'] = new RegExp('"', 'g'); + Sys.Serialization.JavaScriptSerializer._escapeChars['"'] = '\\"'; + for (var i = 0; i < 32; i++) { + var c = String.fromCharCode(i); + Sys.Serialization.JavaScriptSerializer._charsToEscape[i+2] = c; + Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[c] = new RegExp(c, 'g'); + Sys.Serialization.JavaScriptSerializer._escapeChars[c] = replaceChars[i]; + } +} +Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder = function Sys$Serialization$JavaScriptSerializer$_serializeBooleanWithBuilder(object, stringBuilder) { + stringBuilder.append(object.toString()); +} +Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder = function Sys$Serialization$JavaScriptSerializer$_serializeNumberWithBuilder(object, stringBuilder) { + if (isFinite(object)) { + stringBuilder.append(String(object)); + } + else { + throw Error.invalidOperation(Sys.Res.cannotSerializeNonFiniteNumbers); + } +} +Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder = function Sys$Serialization$JavaScriptSerializer$_serializeStringWithBuilder(string, stringBuilder) { + stringBuilder.append('"'); + if (Sys.Serialization.JavaScriptSerializer._escapeRegEx.test(string)) { + if (Sys.Serialization.JavaScriptSerializer._charsToEscape.length === 0) { + Sys.Serialization.JavaScriptSerializer._init(); + } + if (string.length < 128) { + string = string.replace(Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal, + function(x) { return Sys.Serialization.JavaScriptSerializer._escapeChars[x]; }); + } + else { + for (var i = 0; i < 34; i++) { + var c = Sys.Serialization.JavaScriptSerializer._charsToEscape[i]; + if (string.indexOf(c) !== -1) { + if (Sys.Browser.agent === Sys.Browser.Opera || Sys.Browser.agent === Sys.Browser.FireFox) { + string = string.split(c).join(Sys.Serialization.JavaScriptSerializer._escapeChars[c]); + } + else { + string = string.replace(Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[c], + Sys.Serialization.JavaScriptSerializer._escapeChars[c]); + } + } + } + } + } + stringBuilder.append(string); + stringBuilder.append('"'); +} +Sys.Serialization.JavaScriptSerializer._serializeWithBuilder = function Sys$Serialization$JavaScriptSerializer$_serializeWithBuilder(object, stringBuilder, sort, prevObjects) { + var i; + switch (typeof object) { + case 'object': + if (object) { + if (prevObjects){ + for( var j = 0; j < prevObjects.length; j++) { + if (prevObjects[j] === object) { + throw Error.invalidOperation(Sys.Res.cannotSerializeObjectWithCycle); + } + } + } + else { + prevObjects = new Array(); + } + try { + Array.add(prevObjects, object); + + if (Number.isInstanceOfType(object)){ + Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(object, stringBuilder); + } + else if (Boolean.isInstanceOfType(object)){ + Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(object, stringBuilder); + } + else if (String.isInstanceOfType(object)){ + Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(object, stringBuilder); + } + + else if (Array.isInstanceOfType(object)) { + stringBuilder.append('['); + + for (i = 0; i < object.length; ++i) { + if (i > 0) { + stringBuilder.append(','); + } + Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(object[i], stringBuilder,false,prevObjects); + } + stringBuilder.append(']'); + } + else { + if (Date.isInstanceOfType(object)) { + stringBuilder.append('"\\/Date('); + stringBuilder.append(object.getTime()); + stringBuilder.append(')\\/"'); + break; + } + var properties = []; + var propertyCount = 0; + for (var name in object) { + if (name.startsWith('$')) { + continue; + } + if (name === Sys.Serialization.JavaScriptSerializer._serverTypeFieldName && propertyCount !== 0){ + properties[propertyCount++] = properties[0]; + properties[0] = name; + } + else{ + properties[propertyCount++] = name; + } + } + if (sort) properties.sort(); + stringBuilder.append('{'); + var needComma = false; + + for (i=0; i + /// + /// + var e = Function._validateParams(arguments, [ + {name: "object", mayBeNull: true} + ]); + if (e) throw e; + var stringBuilder = new Sys.StringBuilder(); + Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(object, stringBuilder, false); + return stringBuilder.toString(); +} +Sys.Serialization.JavaScriptSerializer.deserialize = function Sys$Serialization$JavaScriptSerializer$deserialize(data, secure) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "data", type: String}, + {name: "secure", type: Boolean, optional: true} + ]); + if (e) throw e; + + if (data.length === 0) throw Error.argument('data', Sys.Res.cannotDeserializeEmptyString); + try { + var exp = data.replace(Sys.Serialization.JavaScriptSerializer._dateRegEx, "$1new Date($2)"); + + if (secure && Sys.Serialization.JavaScriptSerializer._jsonRegEx.test( + exp.replace(Sys.Serialization.JavaScriptSerializer._jsonStringRegEx, ''))) throw null; + return eval('(' + exp + ')'); + } + catch (e) { + throw Error.argument('data', Sys.Res.cannotDeserializeInvalidJson); + } +} + +Sys.CultureInfo = function Sys$CultureInfo(name, numberFormat, dateTimeFormat) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "name", type: String}, + {name: "numberFormat", type: Object}, + {name: "dateTimeFormat", type: Object} + ]); + if (e) throw e; + this.name = name; + this.numberFormat = numberFormat; + this.dateTimeFormat = dateTimeFormat; +} + function Sys$CultureInfo$_getDateTimeFormats() { + if (! this._dateTimeFormats) { + var dtf = this.dateTimeFormat; + this._dateTimeFormats = + [ dtf.MonthDayPattern, + dtf.YearMonthPattern, + dtf.ShortDatePattern, + dtf.ShortTimePattern, + dtf.LongDatePattern, + dtf.LongTimePattern, + dtf.FullDateTimePattern, + dtf.RFC1123Pattern, + dtf.SortableDateTimePattern, + dtf.UniversalSortableDateTimePattern ]; + } + return this._dateTimeFormats; + } + function Sys$CultureInfo$_getMonthIndex(value) { + if (!this._upperMonths) { + this._upperMonths = this._toUpperArray(this.dateTimeFormat.MonthNames); + } + return Array.indexOf(this._upperMonths, this._toUpper(value)); + } + function Sys$CultureInfo$_getAbbrMonthIndex(value) { + if (!this._upperAbbrMonths) { + this._upperAbbrMonths = this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthNames); + } + return Array.indexOf(this._upperAbbrMonths, this._toUpper(value)); + } + function Sys$CultureInfo$_getDayIndex(value) { + if (!this._upperDays) { + this._upperDays = this._toUpperArray(this.dateTimeFormat.DayNames); + } + return Array.indexOf(this._upperDays, this._toUpper(value)); + } + function Sys$CultureInfo$_getAbbrDayIndex(value) { + if (!this._upperAbbrDays) { + this._upperAbbrDays = this._toUpperArray(this.dateTimeFormat.AbbreviatedDayNames); + } + return Array.indexOf(this._upperAbbrDays, this._toUpper(value)); + } + function Sys$CultureInfo$_toUpperArray(arr) { + var result = []; + for (var i = 0, il = arr.length; i < il; i++) { + result[i] = this._toUpper(arr[i]); + } + return result; + } + function Sys$CultureInfo$_toUpper(value) { + return value.split("\u00A0").join(' ').toUpperCase(); + } +Sys.CultureInfo.prototype = { + _getDateTimeFormats: Sys$CultureInfo$_getDateTimeFormats, + _getMonthIndex: Sys$CultureInfo$_getMonthIndex, + _getAbbrMonthIndex: Sys$CultureInfo$_getAbbrMonthIndex, + _getDayIndex: Sys$CultureInfo$_getDayIndex, + _getAbbrDayIndex: Sys$CultureInfo$_getAbbrDayIndex, + _toUpperArray: Sys$CultureInfo$_toUpperArray, + _toUpper: Sys$CultureInfo$_toUpper +} +Sys.CultureInfo._parse = function Sys$CultureInfo$_parse(value) { + var cultureInfo = Sys.Serialization.JavaScriptSerializer.deserialize(value); + return new Sys.CultureInfo(cultureInfo.name, cultureInfo.numberFormat, cultureInfo.dateTimeFormat); +} +Sys.CultureInfo.registerClass('Sys.CultureInfo'); +Sys.CultureInfo.InvariantCulture = Sys.CultureInfo._parse('{"name":"","numberFormat":{"CurrencyDecimalDigits":2,"CurrencyDecimalSeparator":".","IsReadOnly":true,"CurrencyGroupSizes":[3],"NumberGroupSizes":[3],"PercentGroupSizes":[3],"CurrencyGroupSeparator":",","CurrencySymbol":"\u00A4","NaNSymbol":"NaN","CurrencyNegativePattern":0,"NumberNegativePattern":1,"PercentPositivePattern":0,"PercentNegativePattern":0,"NegativeInfinitySymbol":"-Infinity","NegativeSign":"-","NumberDecimalDigits":2,"NumberDecimalSeparator":".","NumberGroupSeparator":",","CurrencyPositivePattern":0,"PositiveInfinitySymbol":"Infinity","PositiveSign":"+","PercentDecimalDigits":2,"PercentDecimalSeparator":".","PercentGroupSeparator":",","PercentSymbol":"%","PerMilleSymbol":"\u2030","NativeDigits":["0","1","2","3","4","5","6","7","8","9"],"DigitSubstitution":1},"dateTimeFormat":{"AMDesignator":"AM","Calendar":{"MinSupportedDateTime":"@-62135568000000@","MaxSupportedDateTime":"@253402300799999@","AlgorithmType":1,"CalendarType":1,"Eras":[1],"TwoDigitYearMax":2029,"IsReadOnly":true},"DateSeparator":"/","FirstDayOfWeek":0,"CalendarWeekRule":0,"FullDateTimePattern":"dddd, dd MMMM yyyy HH:mm:ss","LongDatePattern":"dddd, dd MMMM yyyy","LongTimePattern":"HH:mm:ss","MonthDayPattern":"MMMM dd","PMDesignator":"PM","RFC1123Pattern":"ddd, dd MMM yyyy HH\':\'mm\':\'ss \'GMT\'","ShortDatePattern":"MM/dd/yyyy","ShortTimePattern":"HH:mm","SortableDateTimePattern":"yyyy\'-\'MM\'-\'dd\'T\'HH\':\'mm\':\'ss","TimeSeparator":":","UniversalSortableDateTimePattern":"yyyy\'-\'MM\'-\'dd HH\':\'mm\':\'ss\'Z\'","YearMonthPattern":"yyyy MMMM","AbbreviatedDayNames":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"ShortestDayNames":["Su","Mo","Tu","We","Th","Fr","Sa"],"DayNames":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"AbbreviatedMonthNames":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec",""],"MonthNames":["January","February","March","April","May","June","July","August","September","October","November","December",""],"IsReadOnly":true,"NativeCalendarName":"Gregorian Calendar","AbbreviatedMonthGenitiveNames":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec",""],"MonthGenitiveNames":["January","February","March","April","May","June","July","August","September","October","November","December",""]}}'); +if (typeof(__cultureInfo) === 'undefined') { + var __cultureInfo = '{"name":"en-US","numberFormat":{"CurrencyDecimalDigits":2,"CurrencyDecimalSeparator":".","IsReadOnly":false,"CurrencyGroupSizes":[3],"NumberGroupSizes":[3],"PercentGroupSizes":[3],"CurrencyGroupSeparator":",","CurrencySymbol":"$","NaNSymbol":"NaN","CurrencyNegativePattern":0,"NumberNegativePattern":1,"PercentPositivePattern":0,"PercentNegativePattern":0,"NegativeInfinitySymbol":"-Infinity","NegativeSign":"-","NumberDecimalDigits":2,"NumberDecimalSeparator":".","NumberGroupSeparator":",","CurrencyPositivePattern":0,"PositiveInfinitySymbol":"Infinity","PositiveSign":"+","PercentDecimalDigits":2,"PercentDecimalSeparator":".","PercentGroupSeparator":",","PercentSymbol":"%","PerMilleSymbol":"\u2030","NativeDigits":["0","1","2","3","4","5","6","7","8","9"],"DigitSubstitution":1},"dateTimeFormat":{"AMDesignator":"AM","Calendar":{"MinSupportedDateTime":"@-62135568000000@","MaxSupportedDateTime":"@253402300799999@","AlgorithmType":1,"CalendarType":1,"Eras":[1],"TwoDigitYearMax":2029,"IsReadOnly":false},"DateSeparator":"/","FirstDayOfWeek":0,"CalendarWeekRule":0,"FullDateTimePattern":"dddd, MMMM dd, yyyy h:mm:ss tt","LongDatePattern":"dddd, MMMM dd, yyyy","LongTimePattern":"h:mm:ss tt","MonthDayPattern":"MMMM dd","PMDesignator":"PM","RFC1123Pattern":"ddd, dd MMM yyyy HH\':\'mm\':\'ss \'GMT\'","ShortDatePattern":"M/d/yyyy","ShortTimePattern":"h:mm tt","SortableDateTimePattern":"yyyy\'-\'MM\'-\'dd\'T\'HH\':\'mm\':\'ss","TimeSeparator":":","UniversalSortableDateTimePattern":"yyyy\'-\'MM\'-\'dd HH\':\'mm\':\'ss\'Z\'","YearMonthPattern":"MMMM, yyyy","AbbreviatedDayNames":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"ShortestDayNames":["Su","Mo","Tu","We","Th","Fr","Sa"],"DayNames":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"AbbreviatedMonthNames":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec",""],"MonthNames":["January","February","March","April","May","June","July","August","September","October","November","December",""],"IsReadOnly":false,"NativeCalendarName":"Gregorian Calendar","AbbreviatedMonthGenitiveNames":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec",""],"MonthGenitiveNames":["January","February","March","April","May","June","July","August","September","October","November","December",""]}}'; +} +Sys.CultureInfo.CurrentCulture = Sys.CultureInfo._parse(__cultureInfo); +delete __cultureInfo; + +Sys.UI.Behavior = function Sys$UI$Behavior(element) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element", domElement: true} + ]); + if (e) throw e; + Sys.UI.Behavior.initializeBase(this); + this._element = element; + var behaviors = element._behaviors; + if (!behaviors) { + element._behaviors = [this]; + } + else { + behaviors[behaviors.length] = this; + } +} + function Sys$UI$Behavior$get_element() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._element; + } + function Sys$UI$Behavior$get_id() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + var baseId = Sys.UI.Behavior.callBaseMethod(this, 'get_id'); + if (baseId) return baseId; + if (!this._element || !this._element.id) return ''; + return this._element.id + '$' + this.get_name(); + } + function Sys$UI$Behavior$get_name() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (this._name) return this._name; + var name = Object.getTypeName(this); + var i = name.lastIndexOf('.'); + if (i != -1) name = name.substr(i + 1); + if (!this.get_isInitialized()) this._name = name; + return name; + } + function Sys$UI$Behavior$set_name(value) { + var e = Function._validateParams(arguments, [{name: "value", type: String}]); + if (e) throw e; + if ((value === '') || (value.charAt(0) === ' ') || (value.charAt(value.length - 1) === ' ')) + throw Error.argument('value', Sys.Res.invalidId); + if (typeof(this._element[value]) !== 'undefined') + throw Error.invalidOperation(String.format(Sys.Res.behaviorDuplicateName, value)); + if (this.get_isInitialized()) throw Error.invalidOperation(Sys.Res.cantSetNameAfterInit); + this._name = value; + } + function Sys$UI$Behavior$initialize() { + Sys.UI.Behavior.callBaseMethod(this, 'initialize'); + var name = this.get_name(); + if (name) this._element[name] = this; + } + function Sys$UI$Behavior$dispose() { + Sys.UI.Behavior.callBaseMethod(this, 'dispose'); + if (this._element) { + var name = this.get_name(); + if (name) { + this._element[name] = null; + } + Array.remove(this._element._behaviors, this); + delete this._element; + } + } +Sys.UI.Behavior.prototype = { + _name: null, + get_element: Sys$UI$Behavior$get_element, + get_id: Sys$UI$Behavior$get_id, + get_name: Sys$UI$Behavior$get_name, + set_name: Sys$UI$Behavior$set_name, + initialize: Sys$UI$Behavior$initialize, + dispose: Sys$UI$Behavior$dispose +} +Sys.UI.Behavior.registerClass('Sys.UI.Behavior', Sys.Component); +Sys.UI.Behavior.getBehaviorByName = function Sys$UI$Behavior$getBehaviorByName(element, name) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element", domElement: true}, + {name: "name", type: String} + ]); + if (e) throw e; + var b = element[name]; + return (b && Sys.UI.Behavior.isInstanceOfType(b)) ? b : null; +} +Sys.UI.Behavior.getBehaviors = function Sys$UI$Behavior$getBehaviors(element) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element", domElement: true} + ]); + if (e) throw e; + if (!element._behaviors) return []; + return Array.clone(element._behaviors); +} +Sys.UI.Behavior.getBehaviorsByType = function Sys$UI$Behavior$getBehaviorsByType(element, type) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element", domElement: true}, + {name: "type", type: Type} + ]); + if (e) throw e; + var behaviors = element._behaviors; + var results = []; + if (behaviors) { + for (var i = 0, l = behaviors.length; i < l; i++) { + if (type.isInstanceOfType(behaviors[i])) { + results[results.length] = behaviors[i]; + } + } + } + return results; +} + +Sys.UI.VisibilityMode = function Sys$UI$VisibilityMode() { + /// + /// + /// + if (arguments.length !== 0) throw Error.parameterCount(); + throw Error.notImplemented(); +} +Sys.UI.VisibilityMode.prototype = { + hide: 0, + collapse: 1 +} +Sys.UI.VisibilityMode.registerEnum("Sys.UI.VisibilityMode"); + +Sys.UI.Control = function Sys$UI$Control(element) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "element", domElement: true} + ]); + if (e) throw e; + if (typeof(element.control) != 'undefined') throw Error.invalidOperation(Sys.Res.controlAlreadyDefined); + Sys.UI.Control.initializeBase(this); + this._element = element; + element.control = this; +} + function Sys$UI$Control$get_element() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + return this._element; + } + function Sys$UI$Control$get_id() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (!this._element) return ''; + return this._element.id; + } + function Sys$UI$Control$set_id(value) { + var e = Function._validateParams(arguments, [{name: "value", type: String}]); + if (e) throw e; + throw Error.invalidOperation(Sys.Res.cantSetId); + } + function Sys$UI$Control$get_parent() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (this._parent) return this._parent; + if (!this._element) return null; + + var parentElement = this._element.parentNode; + while (parentElement) { + if (parentElement.control) { + return parentElement.control; + } + parentElement = parentElement.parentNode; + } + return null; + } + function Sys$UI$Control$set_parent(value) { + var e = Function._validateParams(arguments, [{name: "value", type: Sys.UI.Control}]); + if (e) throw e; + if (!this._element) throw Error.invalidOperation(Sys.Res.cantBeCalledAfterDispose); + var parents = [this]; + var current = value; + while (current) { + if (Array.contains(parents, current)) throw Error.invalidOperation(Sys.Res.circularParentChain); + parents[parents.length] = current; + current = current.get_parent(); + } + this._parent = value; + } + function Sys$UI$Control$get_visibilityMode() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (!this._element) throw Error.invalidOperation(Sys.Res.cantBeCalledAfterDispose); + return Sys.UI.DomElement.getVisibilityMode(this._element); + } + function Sys$UI$Control$set_visibilityMode(value) { + var e = Function._validateParams(arguments, [{name: "value", type: Sys.UI.VisibilityMode}]); + if (e) throw e; + if (!this._element) throw Error.invalidOperation(Sys.Res.cantBeCalledAfterDispose); + Sys.UI.DomElement.setVisibilityMode(this._element, value); + } + function Sys$UI$Control$get_visible() { + /// + if (arguments.length !== 0) throw Error.parameterCount(); + if (!this._element) throw Error.invalidOperation(Sys.Res.cantBeCalledAfterDispose); + return Sys.UI.DomElement.getVisible(this._element); + } + function Sys$UI$Control$set_visible(value) { + var e = Function._validateParams(arguments, [{name: "value", type: Boolean}]); + if (e) throw e; + if (!this._element) throw Error.invalidOperation(Sys.Res.cantBeCalledAfterDispose); + Sys.UI.DomElement.setVisible(this._element, value) + } + function Sys$UI$Control$addCssClass(className) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "className", type: String} + ]); + if (e) throw e; + if (!this._element) throw Error.invalidOperation(Sys.Res.cantBeCalledAfterDispose); + Sys.UI.DomElement.addCssClass(this._element, className); + } + function Sys$UI$Control$dispose() { + Sys.UI.Control.callBaseMethod(this, 'dispose'); + if (this._element) { + this._element.control = undefined; + delete this._element; + } + if (this._parent) delete this._parent; + } + function Sys$UI$Control$onBubbleEvent(source, args) { + /// + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "source"}, + {name: "args", type: Sys.EventArgs} + ]); + if (e) throw e; + return false; + } + function Sys$UI$Control$raiseBubbleEvent(source, args) { + /// + /// + /// + var e = Function._validateParams(arguments, [ + {name: "source"}, + {name: "args", type: Sys.EventArgs} + ]); + if (e) throw e; + var currentTarget = this.get_parent(); + while (currentTarget) { + if (currentTarget.onBubbleEvent(source, args)) { + return; + } + currentTarget = currentTarget.get_parent(); + } + } + function Sys$UI$Control$removeCssClass(className) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "className", type: String} + ]); + if (e) throw e; + if (!this._element) throw Error.invalidOperation(Sys.Res.cantBeCalledAfterDispose); + Sys.UI.DomElement.removeCssClass(this._element, className); + } + function Sys$UI$Control$toggleCssClass(className) { + /// + /// + var e = Function._validateParams(arguments, [ + {name: "className", type: String} + ]); + if (e) throw e; + if (!this._element) throw Error.invalidOperation(Sys.Res.cantBeCalledAfterDispose); + Sys.UI.DomElement.toggleCssClass(this._element, className); + } +Sys.UI.Control.prototype = { + _parent: null, + _visibilityMode: Sys.UI.VisibilityMode.hide, + get_element: Sys$UI$Control$get_element, + get_id: Sys$UI$Control$get_id, + set_id: Sys$UI$Control$set_id, + get_parent: Sys$UI$Control$get_parent, + set_parent: Sys$UI$Control$set_parent, + get_visibilityMode: Sys$UI$Control$get_visibilityMode, + set_visibilityMode: Sys$UI$Control$set_visibilityMode, + get_visible: Sys$UI$Control$get_visible, + set_visible: Sys$UI$Control$set_visible, + addCssClass: Sys$UI$Control$addCssClass, + dispose: Sys$UI$Control$dispose, + onBubbleEvent: Sys$UI$Control$onBubbleEvent, + raiseBubbleEvent: Sys$UI$Control$raiseBubbleEvent, + removeCssClass: Sys$UI$Control$removeCssClass, + toggleCssClass: Sys$UI$Control$toggleCssClass +} +Sys.UI.Control.registerClass('Sys.UI.Control', Sys.Component); + + +Type.registerNamespace('Sys'); + +Sys.Res={ +'urlMustBeLessThan1024chars':'The history state must be small enough to not make the url larger than 1024 characters.', +'argumentTypeName':'Value is not the name of an existing type.', +'methodRegisteredTwice':'Method {0} has already been registered.', +'cantSetIdAfterInit':'The id property can\'t be set on this object after initialization.', +'cantBeCalledAfterDispose':'Can\'t be called after dispose.', +'componentCantSetIdAfterAddedToApp':'The id property of a component can\'t be set after it\'s been added to the Application object.', +'behaviorDuplicateName':'A behavior with name \'{0}\' already exists or it is the name of an existing property on the target element.', +'notATypeName':'Value is not a valid type name.', +'typeShouldBeTypeOrString':'Value is not a valid type or a valid type name.', +'historyInvalidHistorySettingCombination':'Cannot set enableHistory to false when ScriptManager.EnableHistory is true.', +'stateMustBeStringDictionary':'The state object can only have null and string fields.', +'boolTrueOrFalse':'Value must be \'true\' or \'false\'.', +'scriptLoadFailedNoHead':'ScriptLoader requires pages to contain a element.', +'stringFormatInvalid':'The format string is invalid.', +'referenceNotFound':'Component \'{0}\' was not found.', +'enumReservedName':'\'{0}\' is a reserved name that can\'t be used as an enum value name.', +'eventHandlerNotFound':'Handler not found.', +'circularParentChain':'The chain of control parents can\'t have circular references.', +'undefinedEvent':'\'{0}\' is not an event.', +'notAMethod':'{0} is not a method.', +'propertyUndefined':'\'{0}\' is not a property or an existing field.', +'historyCannotEnableHistory':'Cannot set enableHistory after initialization.', +'eventHandlerInvalid':'Handler was not added through the Sys.UI.DomEvent.addHandler method.', +'scriptLoadFailedDebug':'The script \'{0}\' failed to load. Check for:\r\n Inaccessible path.\r\n Script errors. (IE) Enable \'Display a notification about every script error\' under advanced settings.\r\n Missing call to Sys.Application.notifyScriptLoaded().', +'propertyNotWritable':'\'{0}\' is not a writable property.', +'enumInvalidValueName':'\'{0}\' is not a valid name for an enum value.', +'controlAlreadyDefined':'A control is already associated with the element.', +'addHandlerCantBeUsedForError':'Can\'t add a handler for the error event using this method. Please set the window.onerror property instead.', +'namespaceContainsObject':'Object {0} already exists and is not a namespace.', +'cantAddNonFunctionhandler':'Can\'t add a handler that is not a function.', +'invalidNameSpace':'Value is not a valid namespace identifier.', +'notAnInterface':'Value is not a valid interface.', +'eventHandlerNotFunction':'Handler must be a function.', +'propertyNotAnArray':'\'{0}\' is not an Array property.', +'typeRegisteredTwice':'Type {0} has already been registered. The type may be defined multiple times or the script file that defines it may have already been loaded. A possible cause is a change of settings during a partial update.', +'cantSetNameAfterInit':'The name property can\'t be set on this object after initialization.', +'historyMissingFrame':'For the history feature to work in IE, the page must have an iFrame element with id \'__historyFrame\' pointed to a page that gets its title from the \'title\' query string parameter and calls Sys.Application._onIFrameLoad() on the parent window. This can be done by setting EnableHistory to true on ScriptManager.', +'appDuplicateComponent':'Two components with the same id \'{0}\' can\'t be added to the application.', +'historyCannotAddHistoryPointWithHistoryDisabled':'A history point can only be added if enableHistory is set to true.', +'appComponentMustBeInitialized':'Components must be initialized before they are added to the Application object.', +'baseNotAClass':'Value is not a class.', +'methodNotFound':'No method found with name \'{0}\'.', +'arrayParseBadFormat':'Value must be a valid string representation for an array. It must start with a \'[\' and end with a \']\'.', +'stateFieldNameInvalid':'State field names must not contain any \'=\' characters.', +'cantSetId':'The id property can\'t be set on this object.', +'historyMissingHiddenInput':'For the history feature to work in Safari 2, the page must have a hidden input element with id \'__history\'.', +'stringFormatBraceMismatch':'The format string contains an unmatched opening or closing brace.', +'enumValueNotInteger':'An enumeration definition can only contain integer values.', +'propertyNullOrUndefined':'Cannot set the properties of \'{0}\' because it returned a null value.', +'argumentDomNode':'Value must be a DOM element or a text node.', +'componentCantSetIdTwice':'The id property of a component can\'t be set more than once.', +'createComponentOnDom':'Value must be null for Components that are not Controls or Behaviors.', +'createNotComponent':'{0} does not derive from Sys.Component.', +'createNoDom':'Value must not be null for Controls and Behaviors.', +'cantAddWithoutId':'Can\'t add a component that doesn\'t have an id.', +'badTypeName':'Value is not the name of the type being registered or the name is a reserved word.', +'argumentInteger':'Value must be an integer.', +'scriptLoadMultipleCallbacks':'The script \'{0}\' contains multiple calls to Sys.Application.notifyScriptLoaded(). Only one is allowed.', +'invokeCalledTwice':'Cannot call invoke more than once.', +'webServiceFailed':'The server method \'{0}\' failed with the following error: {1}', +'webServiceInvalidJsonWrapper':'The server method \'{0}\' returned invalid data. The \'d\' property is missing from the JSON wrapper.', +'argumentType':'Object cannot be converted to the required type.', +'argumentNull':'Value cannot be null.', +'controlCantSetId':'The id property can\'t be set on a control.', +'formatBadFormatSpecifier':'Format specifier was invalid.', +'webServiceFailedNoMsg':'The server method \'{0}\' failed.', +'argumentDomElement':'Value must be a DOM element.', +'invalidExecutorType':'Could not create a valid Sys.Net.WebRequestExecutor from: {0}.', +'cannotCallBeforeResponse':'Cannot call {0} when responseAvailable is false.', +'actualValue':'Actual value was {0}.', +'enumInvalidValue':'\'{0}\' is not a valid value for enum {1}.', +'scriptLoadFailed':'The script \'{0}\' could not be loaded.', +'parameterCount':'Parameter count mismatch.', +'cannotDeserializeEmptyString':'Cannot deserialize empty string.', +'formatInvalidString':'Input string was not in a correct format.', +'invalidTimeout':'Value must be greater than or equal to zero.', +'cannotAbortBeforeStart':'Cannot abort when executor has not started.', +'argument':'Value does not fall within the expected range.', +'cannotDeserializeInvalidJson':'Cannot deserialize. The data does not correspond to valid JSON.', +'invalidHttpVerb':'httpVerb cannot be set to an empty or null string.', +'nullWebRequest':'Cannot call executeRequest with a null webRequest.', +'eventHandlerInvalid':'Handler was not added through the Sys.UI.DomEvent.addHandler method.', +'cannotSerializeNonFiniteNumbers':'Cannot serialize non finite numbers.', +'argumentUndefined':'Value cannot be undefined.', +'webServiceInvalidReturnType':'The server method \'{0}\' returned an invalid type. Expected type: {1}', +'servicePathNotSet':'The path to the web service has not been set.', +'argumentTypeWithTypes':'Object of type \'{0}\' cannot be converted to type \'{1}\'.', +'cannotCallOnceStarted':'Cannot call {0} once started.', +'badBaseUrl1':'Base URL does not contain ://.', +'badBaseUrl2':'Base URL does not contain another /.', +'badBaseUrl3':'Cannot find last / in base URL.', +'setExecutorAfterActive':'Cannot set executor after it has become active.', +'paramName':'Parameter name: {0}', +'cannotCallOutsideHandler':'Cannot call {0} outside of a completed event handler.', +'cannotSerializeObjectWithCycle':'Cannot serialize object with cyclic reference within child properties.', +'format':'One of the identified items was in an invalid format.', +'assertFailedCaller':'Assertion Failed: {0}\r\nat {1}', +'argumentOutOfRange':'Specified argument was out of the range of valid values.', +'webServiceTimedOut':'The server method \'{0}\' timed out.', +'notImplemented':'The method or operation is not implemented.', +'assertFailed':'Assertion Failed: {0}', +'invalidOperation':'Operation is not valid due to the current state of the object.', +'breakIntoDebugger':'{0}\r\n\r\nBreak into debugger?' +}; + +if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded(); diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/MicrosoftAjax.js b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/MicrosoftAjax.js new file mode 100644 index 00000000..db85c14e --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/MicrosoftAjax.js @@ -0,0 +1,7 @@ +//---------------------------------------------------------- +// Copyright (C) Microsoft Corporation. All rights reserved. +//---------------------------------------------------------- +// MicrosoftAjax.js +Function.__typeName="Function";Function.__class=true;Function.createCallback=function(b,a){return function(){var e=arguments.length;if(e>0){var d=[];for(var c=0;cc){var f=Error.parameterCount();f.popStackFrame();return f}return null};Function._validateParameter=function(c,a,h){var b,g=a.type,l=!!a.integer,k=!!a.domElement,m=!!a.mayBeNull;b=Function._validateParameterType(c,g,l,k,m,h);if(b){b.popStackFrame();return b}var e=a.elementType,f=!!a.elementMayBeNull;if(g===Array&&typeof c!=="undefined"&&c!==null&&(e||!f)){var j=!!a.elementInteger,i=!!a.elementDomElement;for(var d=0;d0&&(dc.Calendar.TwoDigitYearMax)return a-100}return a};Date._getParseRegExp=function(b,e){if(!b._parseRegExp)b._parseRegExp={};else if(b._parseRegExp[e])return b._parseRegExp[e];var c=Date._expandFormat(b,e);c=c.replace(/([\^\$\.\*\+\?\|\[\]\(\)\{\}])/g,"\\\\$1");var a=new Sys.StringBuilder("^"),j=[],f=0,i=0,h=Date._getTokenRegExp(),d;while((d=h.exec(c))!==null){var l=c.slice(f,d.index);f=h.lastIndex;i+=Date._appendPreOrPostMatch(l,a);if(i%2===1){a.append(d[0]);continue}switch(d[0]){case "dddd":case "ddd":case "MMMM":case "MMM":a.append("(\\D+)");break;case "tt":case "t":a.append("(\\D*)");break;case "yyyy":a.append("(\\d{4})");break;case "fff":a.append("(\\d{3})");break;case "ff":a.append("(\\d{2})");break;case "f":a.append("(\\d)");break;case "dd":case "d":case "MM":case "M":case "yy":case "y":case "HH":case "H":case "hh":case "h":case "mm":case "m":case "ss":case "s":a.append("(\\d\\d?)");break;case "zzz":a.append("([+-]?\\d\\d?:\\d{2})");break;case "zz":case "z":a.append("([+-]?\\d\\d?)")}Array.add(j,d[0])}Date._appendPreOrPostMatch(c.slice(f),a);a.append("$");var k=a.toString().replace(/\s+/g,"\\s+"),g={"regExp":k,"groups":j};b._parseRegExp[e]=g;return g};Date._getTokenRegExp=function(){return /dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z/g};Date.parseLocale=function(a){return Date._parse(a,Sys.CultureInfo.CurrentCulture,arguments)};Date.parseInvariant=function(a){return Date._parse(a,Sys.CultureInfo.InvariantCulture,arguments)};Date._parse=function(g,c,h){var e=false;for(var a=1,i=h.length;a31)return null;break;case "MMMM":c=j._getMonthIndex(a);if(c<0||c>11)return null;break;case "MMM":c=j._getAbbrMonthIndex(a);if(c<0||c>11)return null;break;case "M":case "MM":var c=parseInt(a,10)-1;if(c<0||c>11)return null;break;case "y":case "yy":f=Date._expandYear(m,parseInt(a,10));if(f<0||f>9999)return null;break;case "yyyy":f=parseInt(a,10);if(f<0||f>9999)return null;break;case "h":case "hh":d=parseInt(a,10);if(d===12)d=0;if(d<0||d>11)return null;break;case "H":case "HH":d=parseInt(a,10);if(d<0||d>23)return null;break;case "m":case "mm":n=parseInt(a,10);if(n<0||n>59)return null;break;case "s":case "ss":o=parseInt(a,10);if(o<0||o>59)return null;break;case "tt":case "t":var u=a.toUpperCase();r=u===m.PMDesignator.toUpperCase();if(!r&&u!==m.AMDesignator.toUpperCase())return null;break;case "f":e=parseInt(a,10)*100;if(e<0||e>999)return null;break;case "ff":e=parseInt(a,10)*10;if(e<0||e>999)return null;break;case "fff":e=parseInt(a,10);if(e<0||e>999)return null;break;case "dddd":g=j._getDayIndex(a);if(g<0||g>6)return null;break;case "ddd":g=j._getAbbrDayIndex(a);if(g<0||g>6)return null;break;case "zzz":var q=a.split(/:/);if(q.length!==2)return null;var i=parseInt(q[0],10);if(i<-12||i>13)return null;var l=parseInt(q[1],10);if(l<0||l>59)return null;k=i*60+(a.startsWith("-")?-l:l);break;case "z":case "zz":var i=parseInt(a,10);if(i<-12||i>13)return null;k=i*60}}var b=new Date;if(f===null)f=b.getFullYear();if(c===null)c=b.getMonth();if(h===null)h=b.getDate();b.setFullYear(f,c,h);if(b.getDate()!==h)return null;if(g!==null&&b.getDay()!==g)return null;if(r&&d<12)d+=12;b.setHours(d,n,o,e);if(k!==null){var t=b.getMinutes()-(k+b.getTimezoneOffset());b.setHours(b.getHours()+parseInt(t/60,10),t%60)}return b};Date.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Date.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Date.prototype._toFormattedString=function(e,h){if(!e||e.length===0||e==="i")if(h&&h.name.length>0)return this.toLocaleString();else return this.toString();var d=h.dateTimeFormat;e=Date._expandFormat(d,e);var a=new Sys.StringBuilder,b;function c(a){if(a<10)return "0"+a;return a.toString()}function g(a){if(a<10)return "00"+a;if(a<100)return "0"+a;return a.toString()}var j=0,i=Date._getTokenRegExp();for(;true;){var l=i.lastIndex,f=i.exec(e),k=e.slice(l,f?f.index:e.length);j+=Date._appendPreOrPostMatch(k,a);if(!f)break;if(j%2===1){a.append(f[0]);continue}switch(f[0]){case "dddd":a.append(d.DayNames[this.getDay()]);break;case "ddd":a.append(d.AbbreviatedDayNames[this.getDay()]);break;case "dd":a.append(c(this.getDate()));break;case "d":a.append(this.getDate());break;case "MMMM":a.append(d.MonthNames[this.getMonth()]);break;case "MMM":a.append(d.AbbreviatedMonthNames[this.getMonth()]);break;case "MM":a.append(c(this.getMonth()+1));break;case "M":a.append(this.getMonth()+1);break;case "yyyy":a.append(this.getFullYear());break;case "yy":a.append(c(this.getFullYear()%100));break;case "y":a.append(this.getFullYear()%100);break;case "hh":b=this.getHours()%12;if(b===0)b=12;a.append(c(b));break;case "h":b=this.getHours()%12;if(b===0)b=12;a.append(b);break;case "HH":a.append(c(this.getHours()));break;case "H":a.append(this.getHours());break;case "mm":a.append(c(this.getMinutes()));break;case "m":a.append(this.getMinutes());break;case "ss":a.append(c(this.getSeconds()));break;case "s":a.append(this.getSeconds());break;case "tt":a.append(this.getHours()<12?d.AMDesignator:d.PMDesignator);break;case "t":a.append((this.getHours()<12?d.AMDesignator:d.PMDesignator).charAt(0));break;case "f":a.append(g(this.getMilliseconds()).charAt(0));break;case "ff":a.append(g(this.getMilliseconds()).substr(0,2));break;case "fff":a.append(g(this.getMilliseconds()));break;case "z":b=this.getTimezoneOffset()/60;a.append((b<=0?"+":"-")+Math.floor(Math.abs(b)));break;case "zz":b=this.getTimezoneOffset()/60;a.append((b<=0?"+":"-")+c(Math.floor(Math.abs(b))));break;case "zzz":b=this.getTimezoneOffset()/60;a.append((b<=0?"+":"-")+c(Math.floor(Math.abs(b)))+d.TimeSeparator+c(Math.abs(this.getTimezoneOffset()%60)))}}return a.toString()};Number.__typeName="Number";Number.__class=true;Number.parseLocale=function(a){return Number._parse(a,Sys.CultureInfo.CurrentCulture)};Number.parseInvariant=function(a){return Number._parse(a,Sys.CultureInfo.InvariantCulture)};Number._parse=function(b,o){b=b.trim();if(b.match(/^[+-]?infinity$/i))return parseFloat(b);if(b.match(/^0x[a-f0-9]+$/i))return parseInt(b);var a=o.numberFormat,g=Number._parseNumberNegativePattern(b,a,a.NumberNegativePattern),h=g[0],e=g[1];if(h===""&&a.NumberNegativePattern!==1){g=Number._parseNumberNegativePattern(b,a,1);h=g[0];e=g[1]}if(h==="")h="+";var j,d,f=e.indexOf("e");if(f<0)f=e.indexOf("E");if(f<0){d=e;j=null}else{d=e.substr(0,f);j=e.substr(f+1)}var c,k,m=d.indexOf(a.NumberDecimalSeparator);if(m<0){c=d;k=null}else{c=d.substr(0,m);k=d.substr(m+a.NumberDecimalSeparator.length)}c=c.split(a.NumberGroupSeparator).join("");var n=a.NumberGroupSeparator.replace(/\u00A0/g," ");if(a.NumberGroupSeparator!==n)c=c.split(n).join("");var l=h+c;if(k!==null)l+="."+k;if(j!==null){var i=Number._parseNumberNegativePattern(j,a,1);if(i[0]==="")i[0]="+";l+="e"+i[0]+i[1]}if(l.match(/^[+-]?\d*\.?\d*(e[+-]?\d+)?$/))return parseFloat(l);return Number.NaN};Number._parseNumberNegativePattern=function(a,d,e){var b=d.NegativeSign,c=d.PositiveSign;switch(e){case 4:b=" "+b;c=" "+c;case 3:if(a.endsWith(b))return ["-",a.substr(0,a.length-b.length)];else if(a.endsWith(c))return ["+",a.substr(0,a.length-c.length)];break;case 2:b+=" ";c+=" ";case 1:if(a.startsWith(b))return ["-",a.substr(b.length)];else if(a.startsWith(c))return ["+",a.substr(c.length)];break;case 0:if(a.startsWith("(")&&a.endsWith(")"))return ["-",a.substr(1,a.length-2)]}return ["",a]};Number.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Number.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Number.prototype._toFormattedString=function(d,j){if(!d||d.length===0||d==="i")if(j&&j.name.length>0)return this.toLocaleString();else return this.toString();var o=["n %","n%","%n"],n=["-n %","-n%","-%n"],p=["(n)","-n","- n","n-","n -"],m=["$n","n$","$ n","n $"],l=["($n)","-$n","$-n","$n-","(n$)","-n$","n-$","n$-","-n $","-$ n","n $-","$ n-","$ -n","n- $","($ n)","(n $)"];function g(a,c,d){for(var b=a.length;b1?parseInt(e[1]):0;e=b.split(".");b=e[0];a=e.length>1?e[1]:"";var q;if(c>0){a=g(a,c,false);b+=a.slice(0,c);a=a.substr(c)}else if(c<0){c=-c;b=g(b,c+1,true);a=b.slice(-c,b.length)+a;b=b.slice(0,-c)}if(i>0){if(a.length>i)a=a.slice(0,i);else a=g(a,i,false);a=p+a}else a="";var d=b.length-1,f="";while(d>=0){if(h===0||h>d)if(f.length>0)return b.slice(0,d+1)+n+f+a;else return b.slice(0,d+1)+a;if(f.length>0)f=b.slice(d-h+1,d+1)+n+f;else f=b.slice(d-h+1,d+1);d-=h;if(k1)b=parseInt(d.slice(1),10);var c;switch(d.charAt(0)){case "d":case "D":c="n";if(b!==-1)e=g(""+e,b,true);if(this<0)e=-e;break;case "c":case "C":if(this<0)c=l[a.CurrencyNegativePattern];else c=m[a.CurrencyPositivePattern];if(b===-1)b=a.CurrencyDecimalDigits;e=i(Math.abs(this),b,a.CurrencyGroupSizes,a.CurrencyGroupSeparator,a.CurrencyDecimalSeparator);break;case "n":case "N":if(this<0)c=p[a.NumberNegativePattern];else c="n";if(b===-1)b=a.NumberDecimalDigits;e=i(Math.abs(this),b,a.NumberGroupSizes,a.NumberGroupSeparator,a.NumberDecimalSeparator);break;case "p":case "P":if(this<0)c=n[a.PercentNegativePattern];else c=o[a.PercentPositivePattern];if(b===-1)b=a.PercentDecimalDigits;e=i(Math.abs(this)*100,b,a.PercentGroupSizes,a.PercentGroupSeparator,a.PercentDecimalSeparator);break;default:throw Error.format(Sys.Res.formatBadFormatSpecifier)}var k=/n|\$|-|%/g,f="";for(;true;){var q=k.lastIndex,h=k.exec(c);f+=c.slice(q,h?h.index:c.length);if(!h)break;switch(h[0]){case "n":f+=e;break;case "$":f+=a.CurrencySymbol;break;case "-":f+=a.NegativeSign;break;case "%":f+=a.PercentSymbol}}return f};RegExp.__typeName="RegExp";RegExp.__class=true;Array.__typeName="Array";Array.__class=true;Array.add=Array.enqueue=function(a,b){a[a.length]=b};Array.addRange=function(a,b){a.push.apply(a,b)};Array.clear=function(a){a.length=0};Array.clone=function(a){if(a.length===1)return [a[0]];else return Array.apply(null,a)};Array.contains=function(a,b){return Array.indexOf(a,b)>=0};Array.dequeue=function(a){return a.shift()};Array.forEach=function(b,e,d){for(var a=0,f=b.length;a=0)b.splice(a,1);return a>=0};Array.removeAt=function(a,b){a.splice(b,1)};if(!window)this.window=this;window.Type=Function;Type.prototype.callBaseMethod=function(a,d,b){var c=this.getBaseMethod(a,d);if(!b)return c.apply(a);else return c.apply(a,b)};Type.prototype.getBaseMethod=function(d,c){var b=this.getBaseType();if(b){var a=b.prototype[c];return a instanceof Function?a:null}return null};Type.prototype.getBaseType=function(){return typeof this.__baseType==="undefined"?null:this.__baseType};Type.prototype.getInterfaces=function(){var a=[],b=this;while(b){var c=b.__interfaces;if(c)for(var d=0,f=c.length;d-1){Sys.Browser.agent=Sys.Browser.InternetExplorer;Sys.Browser.version=parseFloat(navigator.userAgent.match(/MSIE (\d+\.\d+)/)[1]);if(Sys.Browser.version>=8)if(document.documentMode>=7)Sys.Browser.documentMode=document.documentMode;Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(" Firefox/")>-1){Sys.Browser.agent=Sys.Browser.Firefox;Sys.Browser.version=parseFloat(navigator.userAgent.match(/Firefox\/(\d+\.\d+)/)[1]);Sys.Browser.name="Firefox";Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(" AppleWebKit/")>-1){Sys.Browser.agent=Sys.Browser.Safari;Sys.Browser.version=parseFloat(navigator.userAgent.match(/AppleWebKit\/(\d+(\.\d+)?)/)[1]);Sys.Browser.name="Safari"}else if(navigator.userAgent.indexOf("Opera/")>-1)Sys.Browser.agent=Sys.Browser.Opera;Type.registerNamespace("Sys.UI");Sys._Debug=function(){};Sys._Debug.prototype={_appendConsole:function(a){if(typeof Debug!=="undefined"&&Debug.writeln)Debug.writeln(a);if(window.console&&window.console.log)window.console.log(a);if(window.opera)window.opera.postError(a);if(window.debugService)window.debugService.trace(a)},_appendTrace:function(b){var a=document.getElementById("TraceConsole");if(a&&a.tagName.toUpperCase()==="TEXTAREA")a.value+=b+"\n"},assert:function(c,a,b){if(!c){a=b&&this.assert.caller?String.format(Sys.Res.assertFailedCaller,a,this.assert.caller):String.format(Sys.Res.assertFailed,a);if(confirm(String.format(Sys.Res.breakIntoDebugger,a)))this.fail(a)}},clearTrace:function(){var a=document.getElementById("TraceConsole");if(a&&a.tagName.toUpperCase()==="TEXTAREA")a.value=""},fail:function(message){this._appendConsole(message);if(Sys.Browser.hasDebuggerStatement)eval("debugger")},trace:function(a){this._appendConsole(a);this._appendTrace(a)},traceDump:function(a,b){var c=this._traceDump(a,b,true)},_traceDump:function(a,c,f,b,d){c=c?c:"traceDump";b=b?b:"";if(a===null){this.trace(b+c+": null");return}switch(typeof a){case "undefined":this.trace(b+c+": Undefined");break;case "number":case "string":case "boolean":this.trace(b+c+": "+a);break;default:if(Date.isInstanceOfType(a)||RegExp.isInstanceOfType(a)){this.trace(b+c+": "+a.toString());break}if(!d)d=[];else if(Array.contains(d,a)){this.trace(b+c+": ...");return}Array.add(d,a);if(a==window||a===document||window.HTMLElement&&a instanceof HTMLElement||typeof a.nodeName==="string"){var k=a.tagName?a.tagName:"DomElement";if(a.id)k+=" - "+a.id;this.trace(b+c+" {"+k+"}")}else{var i=Object.getTypeName(a);this.trace(b+c+(typeof i==="string"?" {"+i+"}":""));if(b===""||f){b+=" ";var e,j,l,g,h;if(Array.isInstanceOfType(a)){j=a.length;for(e=0;e=0;d--){var k=h[d].trim();b=a[k];if(typeof b!=="number")throw Error.argument("value",String.format(Sys.Res.enumInvalidValue,c.split(",")[d].trim(),this.__typeName));j|=b}return j}}function Sys$Enum$toString(c){if(typeof c==="undefined"||c===null)return this.__string;var d=this.prototype,a;if(!this.__flags||c===0){for(a in d)if(d[a]===c)return a}else{var b=this.__sortedValues;if(!b){b=[];for(a in d)b[b.length]={key:a,value:d[a]};b.sort(function(a,b){return a.value-b.value});this.__sortedValues=b}var e=[],g=c;for(a=b.length-1;a>=0;a--){var h=b[a],f=h.value;if(f===0)continue;if((f&c)===f){e[e.length]=h.key;g-=f;if(g===0)break}}if(e.length&&g===0)return e.reverse().join(", ")}return ""}Type.prototype.registerEnum=function(b,c){Sys.__upperCaseTypes[b.toUpperCase()]=this;for(var a in this.prototype)this[a]=this.prototype[a];this.__typeName=b;this.parse=Sys$Enum$parse;this.__string=this.toString();this.toString=Sys$Enum$toString;this.__flags=c;this.__enum=true};Type.isEnum=function(a){if(typeof a==="undefined"||a===null)return false;return !!a.__enum};Type.isFlags=function(a){if(typeof a==="undefined"||a===null)return false;return !!a.__flags};Sys.EventHandlerList=function(){this._list={}};Sys.EventHandlerList.prototype={addHandler:function(b,a){Array.add(this._getEvent(b,true),a)},removeHandler:function(c,b){var a=this._getEvent(c);if(!a)return;Array.remove(a,b)},getHandler:function(b){var a=this._getEvent(b);if(!a||a.length===0)return null;a=Array.clone(a);return function(c,d){for(var b=0,e=a.length;b=0;c--)$removeHandler(a,b,d[c].handler)}a._events=null}},$removeHandler=Sys.UI.DomEvent.removeHandler=function(a,e,f){var d=null,c=a._events[e];for(var b=0,g=c.length;b=0)d.className=(a.substr(0,b)+" "+a.substring(b+c.length+1,a.length)).trim()};Sys.UI.DomElement.setLocation=function(b,c,d){var a=b.style;a.position="absolute";a.left=c+"px";a.top=d+"px"};Sys.UI.DomElement.toggleCssClass=function(b,a){if(Sys.UI.DomElement.containsCssClass(b,a))Sys.UI.DomElement.removeCssClass(b,a);else Sys.UI.DomElement.addCssClass(b,a)};Sys.UI.DomElement.getVisibilityMode=function(a){return a._visibilityMode===Sys.UI.VisibilityMode.hide?Sys.UI.VisibilityMode.hide:Sys.UI.VisibilityMode.collapse};Sys.UI.DomElement.setVisibilityMode=function(a,b){Sys.UI.DomElement._ensureOldDisplayMode(a);if(a._visibilityMode!==b){a._visibilityMode=b;if(Sys.UI.DomElement.getVisible(a)===false)if(a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display="none";a._visibilityMode=b}};Sys.UI.DomElement.getVisible=function(b){var a=b.currentStyle||Sys.UI.DomElement._getCurrentStyle(b);if(!a)return true;return a.visibility!=="hidden"&&a.display!=="none"};Sys.UI.DomElement.setVisible=function(a,b){if(b!==Sys.UI.DomElement.getVisible(a)){Sys.UI.DomElement._ensureOldDisplayMode(a);a.style.visibility=b?"visible":"hidden";if(b||a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display="none"}};Sys.UI.DomElement._ensureOldDisplayMode=function(a){if(!a._oldDisplayMode){var b=a.currentStyle||Sys.UI.DomElement._getCurrentStyle(a);a._oldDisplayMode=b?b.display:null;if(!a._oldDisplayMode||a._oldDisplayMode==="none")switch(a.tagName.toUpperCase()){case "DIV":case "P":case "ADDRESS":case "BLOCKQUOTE":case "BODY":case "COL":case "COLGROUP":case "DD":case "DL":case "DT":case "FIELDSET":case "FORM":case "H1":case "H2":case "H3":case "H4":case "H5":case "H6":case "HR":case "IFRAME":case "LEGEND":case "OL":case "PRE":case "TABLE":case "TD":case "TH":case "TR":case "UL":a._oldDisplayMode="block";break;case "LI":a._oldDisplayMode="list-item";break;default:a._oldDisplayMode="inline"}}};Sys.UI.DomElement._getWindow=function(a){var b=a.ownerDocument||a.document||a;return b.defaultView||b.parentWindow};Sys.UI.DomElement._getCurrentStyle=function(a){if(a.nodeType===3)return null;var c=Sys.UI.DomElement._getWindow(a);if(a.documentElement)a=a.documentElement;var b=c&&a!==c&&c.getComputedStyle?c.getComputedStyle(a,null):a.currentStyle||a.style;if(!b&&Sys.Browser.agent===Sys.Browser.Safari&&a.style){var g=a.style.display,f=a.style.position;a.style.position="absolute";a.style.display="block";var e=c.getComputedStyle(a,null);a.style.display=g;a.style.position=f;b={};for(var d in e)b[d]=e[d];b.display="none"}return b};Sys.IContainer=function(){};Sys.IContainer.prototype={};Sys.IContainer.registerInterface("Sys.IContainer");Sys._ScriptLoader=function(){this._scriptsToLoad=null;this._sessions=[];this._scriptLoadedDelegate=Function.createDelegate(this,this._scriptLoadedHandler)};Sys._ScriptLoader.prototype={dispose:function(){this._stopSession();this._loading=false;if(this._events)delete this._events;this._sessions=null;this._currentSession=null;this._scriptLoadedDelegate=null},loadScripts:function(d,b,c,a){var e={allScriptsLoadedCallback:b,scriptLoadFailedCallback:c,scriptLoadTimeoutCallback:a,scriptsToLoad:this._scriptsToLoad,scriptTimeout:d};this._scriptsToLoad=null;this._sessions[this._sessions.length]=e;if(!this._loading)this._nextSession()},notifyScriptLoaded:function(){if(!this._loading)return;this._currentTask._notified++;if(Sys.Browser.agent===Sys.Browser.Safari)if(this._currentTask._notified===1)window.setTimeout(Function.createDelegate(this,function(){this._scriptLoadedHandler(this._currentTask.get_scriptElement(),true)}),0)},queueCustomScriptTag:function(a){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,a)},queueScriptBlock:function(a){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,{text:a})},queueScriptReference:function(a){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,{src:a})},_createScriptElement:function(c){var a=document.createElement("script");a.type="text/javascript";for(var b in c)a[b]=c[b];return a},_loadScriptsInternal:function(){var b=this._currentSession;if(b.scriptsToLoad&&b.scriptsToLoad.length>0){var c=Array.dequeue(b.scriptsToLoad),a=this._createScriptElement(c);if(a.text&&Sys.Browser.agent===Sys.Browser.Safari){a.innerHTML=a.text;delete a.text}if(typeof c.src==="string"){this._currentTask=new Sys._ScriptLoaderTask(a,this._scriptLoadedDelegate);this._currentTask.execute()}else{document.getElementsByTagName("head")[0].appendChild(a);Sys._ScriptLoader._clearScript(a);this._loadScriptsInternal()}}else{this._stopSession();var d=b.allScriptsLoadedCallback;if(d)d(this);this._nextSession()}},_nextSession:function(){if(this._sessions.length===0){this._loading=false;this._currentSession=null;return}this._loading=true;var a=Array.dequeue(this._sessions);this._currentSession=a;if(a.scriptTimeout>0)this._timeoutCookie=window.setTimeout(Function.createDelegate(this,this._scriptLoadTimeoutHandler),a.scriptTimeout*1000);this._loadScriptsInternal()},_raiseError:function(a){var c=this._currentSession.scriptLoadFailedCallback,b=this._currentTask.get_scriptElement();this._stopSession();if(c){c(this,b,a);this._nextSession()}else{this._loading=false;throw Sys._ScriptLoader._errorScriptLoadFailed(b.src,a)}},_scriptLoadedHandler:function(a,b){if(b&&this._currentTask._notified)if(this._currentTask._notified>1)this._raiseError(true);else{Array.add(Sys._ScriptLoader._getLoadedScripts(),a.src);this._currentTask.dispose();this._currentTask=null;this._loadScriptsInternal()}else this._raiseError(false)},_scriptLoadTimeoutHandler:function(){var a=this._currentSession.scriptLoadTimeoutCallback;this._stopSession();if(a)a(this);this._nextSession()},_stopSession:function(){if(this._timeoutCookie){window.clearTimeout(this._timeoutCookie);this._timeoutCookie=null}if(this._currentTask){this._currentTask.dispose();this._currentTask=null}}};Sys._ScriptLoader.registerClass("Sys._ScriptLoader",null,Sys.IDisposable);Sys._ScriptLoader.getInstance=function(){var a=Sys._ScriptLoader._activeInstance;if(!a)a=Sys._ScriptLoader._activeInstance=new Sys._ScriptLoader;return a};Sys._ScriptLoader.isScriptLoaded=function(b){var a=document.createElement("script");a.src=b;return Array.contains(Sys._ScriptLoader._getLoadedScripts(),a.src)};Sys._ScriptLoader.readLoadedScripts=function(){if(!Sys._ScriptLoader._referencedScripts){var b=Sys._ScriptLoader._referencedScripts=[],c=document.getElementsByTagName("script");for(i=c.length-1;i>=0;i--){var d=c[i],a=d.src;if(a.length)if(!Array.contains(b,a))Array.add(b,a)}}};Sys._ScriptLoader._clearScript=function(a){if(!Sys.Debug.isDebug)a.parentNode.removeChild(a)};Sys._ScriptLoader._errorScriptLoadFailed=function(b,d){var a;if(d)a=Sys.Res.scriptLoadMultipleCallbacks;else a=Sys.Res.scriptLoadFailed;var e="Sys.ScriptLoadFailedException: "+String.format(a,b),c=Error.create(e,{name:"Sys.ScriptLoadFailedException","scriptUrl":b});c.popStackFrame();return c};Sys._ScriptLoader._getLoadedScripts=function(){if(!Sys._ScriptLoader._referencedScripts){Sys._ScriptLoader._referencedScripts=[];Sys._ScriptLoader.readLoadedScripts()}return Sys._ScriptLoader._referencedScripts};Sys._ScriptLoaderTask=function(b,a){this._scriptElement=b;this._completedCallback=a;this._notified=0};Sys._ScriptLoaderTask.prototype={get_scriptElement:function(){return this._scriptElement},dispose:function(){if(this._disposed)return;this._disposed=true;this._removeScriptElementHandlers();Sys._ScriptLoader._clearScript(this._scriptElement);this._scriptElement=null},execute:function(){this._addScriptElementHandlers();document.getElementsByTagName("head")[0].appendChild(this._scriptElement)},_addScriptElementHandlers:function(){this._scriptLoadDelegate=Function.createDelegate(this,this._scriptLoadHandler);if(Sys.Browser.agent!==Sys.Browser.InternetExplorer){this._scriptElement.readyState="loaded";$addHandler(this._scriptElement,"load",this._scriptLoadDelegate)}else $addHandler(this._scriptElement,"readystatechange",this._scriptLoadDelegate);if(this._scriptElement.addEventListener){this._scriptErrorDelegate=Function.createDelegate(this,this._scriptErrorHandler);this._scriptElement.addEventListener("error",this._scriptErrorDelegate,false)}},_removeScriptElementHandlers:function(){if(this._scriptLoadDelegate){var a=this.get_scriptElement();if(Sys.Browser.agent!==Sys.Browser.InternetExplorer)$removeHandler(a,"load",this._scriptLoadDelegate);else $removeHandler(a,"readystatechange",this._scriptLoadDelegate);if(this._scriptErrorDelegate){this._scriptElement.removeEventListener("error",this._scriptErrorDelegate,false);this._scriptErrorDelegate=null}this._scriptLoadDelegate=null}},_scriptErrorHandler:function(){if(this._disposed)return;this._completedCallback(this.get_scriptElement(),false)},_scriptLoadHandler:function(){if(this._disposed)return;var a=this.get_scriptElement();if(a.readyState!=="loaded"&&a.readyState!=="complete")return;var b=this;window.setTimeout(function(){b._completedCallback(a,true)},0)}};Sys._ScriptLoaderTask.registerClass("Sys._ScriptLoaderTask",null,Sys.IDisposable);Sys.ApplicationLoadEventArgs=function(b,a){Sys.ApplicationLoadEventArgs.initializeBase(this);this._components=b;this._isPartialLoad=a};Sys.ApplicationLoadEventArgs.prototype={get_components:function(){return this._components},get_isPartialLoad:function(){return this._isPartialLoad}};Sys.ApplicationLoadEventArgs.registerClass("Sys.ApplicationLoadEventArgs",Sys.EventArgs);Sys.HistoryEventArgs=function(a){Sys.HistoryEventArgs.initializeBase(this);this._state=a};Sys.HistoryEventArgs.prototype={get_state:function(){return this._state}};Sys.HistoryEventArgs.registerClass("Sys.HistoryEventArgs",Sys.EventArgs);Sys._Application=function(){Sys._Application.initializeBase(this);this._disposableObjects=[];this._components={};this._createdComponents=[];this._secondPassComponents=[];this._appLoadHandler=null;this._beginRequestHandler=null;this._clientId=null;this._currentEntry="";this._endRequestHandler=null;this._history=null;this._enableHistory=false;this._historyFrame=null;this._historyInitialized=false;this._historyInitialLength=0;this._historyLength=0;this._historyPointIsNew=false;this._ignoreTimer=false;this._initialState=null;this._state={};this._timerCookie=0;this._timerHandler=null;this._uniqueId=null;this._unloadHandlerDelegate=Function.createDelegate(this,this._unloadHandler);this._loadHandlerDelegate=Function.createDelegate(this,this._loadHandler);Sys.UI.DomEvent.addHandler(window,"unload",this._unloadHandlerDelegate);Sys.UI.DomEvent.addHandler(window,"load",this._loadHandlerDelegate)};Sys._Application.prototype={_creatingComponents:false,_disposing:false,get_isCreatingComponents:function(){return this._creatingComponents},get_stateString:function(){var a=window.location.hash;if(this._isSafari2()){var b=this._getHistory();if(b)a=b[window.history.length-this._historyInitialLength]}if(a.length>0&&a.charAt(0)==="#")a=a.substring(1);if(Sys.Browser.agent===Sys.Browser.Firefox)a=this._serializeState(this._deserializeState(a,true));return a},get_enableHistory:function(){return this._enableHistory},set_enableHistory:function(a){this._enableHistory=a},add_init:function(a){if(this._initialized)a(this,Sys.EventArgs.Empty);else this.get_events().addHandler("init",a)},remove_init:function(a){this.get_events().removeHandler("init",a)},add_load:function(a){this.get_events().addHandler("load",a)},remove_load:function(a){this.get_events().removeHandler("load",a)},add_navigate:function(a){this.get_events().addHandler("navigate",a)},remove_navigate:function(a){this.get_events().removeHandler("navigate",a)},add_unload:function(a){this.get_events().addHandler("unload",a)},remove_unload:function(a){this.get_events().removeHandler("unload",a)},addComponent:function(a){this._components[a.get_id()]=a},addHistoryPoint:function(c,f){this._ensureHistory();var b=this._state;for(var a in c){var d=c[a];if(d===null){if(typeof b[a]!=="undefined")delete b[a]}else b[a]=d}var e=this._serializeState(b);this._historyPointIsNew=true;this._setState(e,f);this._raiseNavigate()},beginCreateComponents:function(){this._creatingComponents=true},dispose:function(){if(!this._disposing){this._disposing=true;if(this._timerCookie){window.clearTimeout(this._timerCookie);delete this._timerCookie}if(this._endRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_endRequest(this._endRequestHandler);delete this._endRequestHandler}if(this._beginRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_beginRequest(this._beginRequestHandler);delete this._beginRequestHandler}if(window.pageUnload)window.pageUnload(this,Sys.EventArgs.Empty);var c=this.get_events().getHandler("unload");if(c)c(this,Sys.EventArgs.Empty);var b=Array.clone(this._disposableObjects);for(var a=0,e=b.length;a'");d.write(""+(c||document.title)+"parent.Sys.Application._onIFrameLoad(\''+a+"');");d.close()}this._ignoreTimer=false;var h=this.get_stateString();this._currentEntry=a;if(a!==h){if(this._isSafari2()){var g=this._getHistory();g[window.history.length-this._historyInitialLength+1]=a;this._setHistory(g);this._historyLength=window.history.length+1;var b=document.createElement("form");b.method="get";b.action="#"+a;document.appendChild(b);b.submit();document.removeChild(b)}else window.location.hash=a;if(typeof c!=="undefined"&&c!==null)document.title=c}}},_unloadHandler:function(){this.dispose()},_updateHiddenField:function(b){if(this._clientId){var a=document.getElementById(this._clientId);if(a)a.value=b}}};Sys._Application.registerClass("Sys._Application",Sys.Component,Sys.IContainer);Sys.Application=new Sys._Application;var $find=Sys.Application.findComponent;Type.registerNamespace("Sys.Net");Sys.Net.WebRequestExecutor=function(){this._webRequest=null;this._resultObject=null};Sys.Net.WebRequestExecutor.prototype={get_webRequest:function(){return this._webRequest},_set_webRequest:function(a){this._webRequest=a},get_started:function(){throw Error.notImplemented()},get_responseAvailable:function(){throw Error.notImplemented()},get_timedOut:function(){throw Error.notImplemented()},get_aborted:function(){throw Error.notImplemented()},get_responseData:function(){throw Error.notImplemented()},get_statusCode:function(){throw Error.notImplemented()},get_statusText:function(){throw Error.notImplemented()},get_xml:function(){throw Error.notImplemented()},get_object:function(){if(!this._resultObject)this._resultObject=Sys.Serialization.JavaScriptSerializer.deserialize(this.get_responseData());return this._resultObject},executeRequest:function(){throw Error.notImplemented()},abort:function(){throw Error.notImplemented()},getResponseHeader:function(){throw Error.notImplemented()},getAllResponseHeaders:function(){throw Error.notImplemented()}};Sys.Net.WebRequestExecutor.registerClass("Sys.Net.WebRequestExecutor");Sys.Net.XMLDOM=function(d){if(!window.DOMParser){var c=["Msxml2.DOMDocument.3.0","Msxml2.DOMDocument"];for(var b=0,f=c.length;b0)this._timer=window.setTimeout(Function.createDelegate(this,this._onTimeout),d);this._xmlHttpRequest.send(c);this._started=true},getResponseHeader:function(b){var a;try{a=this._xmlHttpRequest.getResponseHeader(b)}catch(c){}if(!a)a="";return a},getAllResponseHeaders:function(){return this._xmlHttpRequest.getAllResponseHeaders()},get_responseData:function(){return this._xmlHttpRequest.responseText},get_statusCode:function(){var a=0;try{a=this._xmlHttpRequest.status}catch(b){}return a},get_statusText:function(){return this._xmlHttpRequest.statusText},get_xml:function(){var a=this._xmlHttpRequest.responseXML;if(!a||!a.documentElement){a=Sys.Net.XMLDOM(this._xmlHttpRequest.responseText);if(!a||!a.documentElement)return null}else if(navigator.userAgent.indexOf("MSIE")!==-1)a.setProperty("SelectionLanguage","XPath");if(a.documentElement.namespaceURI==="http://www.mozilla.org/newlayout/xml/parsererror.xml"&&a.documentElement.tagName==="parsererror")return null;if(a.documentElement.firstChild&&a.documentElement.firstChild.tagName==="parsererror")return null;return a},abort:function(){if(this._aborted||this._responseAvailable||this._timedOut)return;this._aborted=true;this._clearTimer();if(this._xmlHttpRequest&&!this._responseAvailable){this._xmlHttpRequest.onreadystatechange=Function.emptyMethod;this._xmlHttpRequest.abort();this._xmlHttpRequest=null;this._webRequest.completed(Sys.EventArgs.Empty)}}};Sys.Net.XMLHttpExecutor.registerClass("Sys.Net.XMLHttpExecutor",Sys.Net.WebRequestExecutor);Sys.Net._WebRequestManager=function(){this._defaultTimeout=0;this._defaultExecutorType="Sys.Net.XMLHttpExecutor"};Sys.Net._WebRequestManager.prototype={add_invokingRequest:function(a){this._get_eventHandlerList().addHandler("invokingRequest",a)},remove_invokingRequest:function(a){this._get_eventHandlerList().removeHandler("invokingRequest",a)},add_completedRequest:function(a){this._get_eventHandlerList().addHandler("completedRequest",a)},remove_completedRequest:function(a){this._get_eventHandlerList().removeHandler("completedRequest",a)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_defaultTimeout:function(){return this._defaultTimeout},set_defaultTimeout:function(a){this._defaultTimeout=a},get_defaultExecutorType:function(){return this._defaultExecutorType},set_defaultExecutorType:function(a){this._defaultExecutorType=a},executeRequest:function(webRequest){var executor=webRequest.get_executor();if(!executor){var failed=false;try{var executorType=eval(this._defaultExecutorType);executor=new executorType}catch(a){failed=true}webRequest.set_executor(executor)}if(executor.get_aborted())return;var evArgs=new Sys.Net.NetworkRequestEventArgs(webRequest),handler=this._get_eventHandlerList().getHandler("invokingRequest");if(handler)handler(this,evArgs);if(!evArgs.get_cancel())executor.executeRequest()}};Sys.Net._WebRequestManager.registerClass("Sys.Net._WebRequestManager");Sys.Net.WebRequestManager=new Sys.Net._WebRequestManager;Sys.Net.NetworkRequestEventArgs=function(a){Sys.Net.NetworkRequestEventArgs.initializeBase(this);this._webRequest=a};Sys.Net.NetworkRequestEventArgs.prototype={get_webRequest:function(){return this._webRequest}};Sys.Net.NetworkRequestEventArgs.registerClass("Sys.Net.NetworkRequestEventArgs",Sys.CancelEventArgs);Sys.Net.WebRequest=function(){this._url="";this._headers={};this._body=null;this._userContext=null;this._httpVerb=null;this._executor=null;this._invokeCalled=false;this._timeout=0};Sys.Net.WebRequest.prototype={add_completed:function(a){this._get_eventHandlerList().addHandler("completed",a)},remove_completed:function(a){this._get_eventHandlerList().removeHandler("completed",a)},completed:function(b){var a=Sys.Net.WebRequestManager._get_eventHandlerList().getHandler("completedRequest");if(a)a(this._executor,b);a=this._get_eventHandlerList().getHandler("completed");if(a)a(this._executor,b)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_url:function(){return this._url},set_url:function(a){this._url=a},get_headers:function(){return this._headers},get_httpVerb:function(){if(this._httpVerb===null){if(this._body===null)return "GET";return "POST"}return this._httpVerb},set_httpVerb:function(a){this._httpVerb=a},get_body:function(){return this._body},set_body:function(a){this._body=a},get_userContext:function(){return this._userContext},set_userContext:function(a){this._userContext=a},get_executor:function(){return this._executor},set_executor:function(a){this._executor=a;this._executor._set_webRequest(this)},get_timeout:function(){if(this._timeout===0)return Sys.Net.WebRequestManager.get_defaultTimeout();return this._timeout},set_timeout:function(a){this._timeout=a},getResolvedUrl:function(){return Sys.Net.WebRequest._resolveUrl(this._url)},invoke:function(){Sys.Net.WebRequestManager.executeRequest(this);this._invokeCalled=true}};Sys.Net.WebRequest._resolveUrl=function(b,a){if(b&&b.indexOf("://")!==-1)return b;if(!a||a.length===0){var d=document.getElementsByTagName("base")[0];if(d&&d.href&&d.href.length>0)a=d.href;else a=document.URL}var c=a.indexOf("?");if(c!==-1)a=a.substr(0,c);c=a.indexOf("#");if(c!==-1)a=a.substr(0,c);a=a.substr(0,a.lastIndexOf("/")+1);if(!b||b.length===0)return a;if(b.charAt(0)==="/"){var e=a.indexOf("://"),g=a.indexOf("/",e+3);return a.substr(0,g)+b}else{var f=a.lastIndexOf("/");return a.substr(0,f+1)+b}};Sys.Net.WebRequest._createQueryString=function(d,b){if(!b)b=encodeURIComponent;var a=new Sys.StringBuilder,f=0;for(var c in d){var e=d[c];if(typeof e==="function")continue;var g=Sys.Serialization.JavaScriptSerializer.serialize(e);if(f!==0)a.append("&");a.append(c);a.append("=");a.append(b(g));f++}return a.toString()};Sys.Net.WebRequest._createUrl=function(a,b){if(!b)return a;var d=Sys.Net.WebRequest._createQueryString(b);if(d.length>0){var c="?";if(a&&a.indexOf("?")!==-1)c="&";return a+c+d}else return a};Sys.Net.WebRequest.registerClass("Sys.Net.WebRequest");Sys.Net.WebServiceProxy=function(){};Sys.Net.WebServiceProxy.prototype={get_timeout:function(){return this._timeout},set_timeout:function(a){if(a<0)throw Error.argumentOutOfRange("value",a,Sys.Res.invalidTimeout);this._timeout=a},get_defaultUserContext:function(){return this._userContext},set_defaultUserContext:function(a){this._userContext=a},get_defaultSucceededCallback:function(){return this._succeeded},set_defaultSucceededCallback:function(a){this._succeeded=a},get_defaultFailedCallback:function(){return this._failed},set_defaultFailedCallback:function(a){this._failed=a},get_path:function(){return this._path},set_path:function(a){this._path=a},_invoke:function(d,e,g,f,c,b,a){if(c===null||typeof c==="undefined")c=this.get_defaultSucceededCallback();if(b===null||typeof b==="undefined")b=this.get_defaultFailedCallback();if(a===null||typeof a==="undefined")a=this.get_defaultUserContext();return Sys.Net.WebServiceProxy.invoke(d,e,g,f,c,b,a,this.get_timeout())}};Sys.Net.WebServiceProxy.registerClass("Sys.Net.WebServiceProxy");Sys.Net.WebServiceProxy.invoke=function(k,a,j,d,i,c,f,h){var b=new Sys.Net.WebRequest;b.get_headers()["Content-Type"]="application/json; charset=utf-8";if(!d)d={};var g=d;if(!j||!g)g={};b.set_url(Sys.Net.WebRequest._createUrl(k+"/"+encodeURIComponent(a),g));var e=null;if(!j){e=Sys.Serialization.JavaScriptSerializer.serialize(d);if(e==="{}")e=""}b.set_body(e);b.add_completed(l);if(h&&h>0)b.set_timeout(h);b.invoke();function l(d){if(d.get_responseAvailable()){var g=d.get_statusCode(),b=null;try{var e=d.getResponseHeader("Content-Type");if(e.startsWith("application/json"))b=d.get_object();else if(e.startsWith("text/xml"))b=d.get_xml();else b=d.get_responseData()}catch(m){}var k=d.getResponseHeader("jsonerror"),h=k==="true";if(h){if(b)b=new Sys.Net.WebServiceError(false,b.Message,b.StackTrace,b.ExceptionType)}else if(e.startsWith("application/json"))b=b.d;if(g<200||g>=300||h){if(c){if(!b||!h)b=new Sys.Net.WebServiceError(false,String.format(Sys.Res.webServiceFailedNoMsg,a),"","");b._statusCode=g;c(b,f,a)}}else if(i)i(b,f,a)}else{var j;if(d.get_timedOut())j=String.format(Sys.Res.webServiceTimedOut,a);else j=String.format(Sys.Res.webServiceFailedNoMsg,a);if(c)c(new Sys.Net.WebServiceError(d.get_timedOut(),j,"",""),f,a)}}return b};Sys.Net.WebServiceProxy._generateTypedConstructor=function(a){return function(b){if(b)for(var c in b)this[c]=b[c];this.__type=a}};Sys.Net.WebServiceError=function(c,d,b,a){this._timedOut=c;this._message=d;this._stackTrace=b;this._exceptionType=a;this._statusCode=-1};Sys.Net.WebServiceError.prototype={get_timedOut:function(){return this._timedOut},get_statusCode:function(){return this._statusCode},get_message:function(){return this._message},get_stackTrace:function(){return this._stackTrace},get_exceptionType:function(){return this._exceptionType}};Sys.Net.WebServiceError.registerClass("Sys.Net.WebServiceError");Type.registerNamespace("Sys.Services");Sys.Services._ProfileService=function(){Sys.Services._ProfileService.initializeBase(this);this.properties={}};Sys.Services._ProfileService.DefaultWebServicePath="";Sys.Services._ProfileService.prototype={_defaultLoadCompletedCallback:null,_defaultSaveCompletedCallback:null,_path:"",_timeout:0,get_defaultLoadCompletedCallback:function(){return this._defaultLoadCompletedCallback},set_defaultLoadCompletedCallback:function(a){this._defaultLoadCompletedCallback=a},get_defaultSaveCompletedCallback:function(){return this._defaultSaveCompletedCallback},set_defaultSaveCompletedCallback:function(a){this._defaultSaveCompletedCallback=a},get_path:function(){return this._path||""},load:function(c,d,e,f){var b,a;if(!c){a="GetAllPropertiesForCurrentUser";b={authenticatedUserOnly:false}}else{a="GetPropertiesForCurrentUser";b={properties:this._clonePropertyNames(c),authenticatedUserOnly:false}}this._invoke(this._get_path(),a,false,b,Function.createDelegate(this,this._onLoadComplete),Function.createDelegate(this,this._onLoadFailed),[d,e,f])},save:function(d,b,c,e){var a=this._flattenProperties(d,this.properties);this._invoke(this._get_path(),"SetPropertiesForCurrentUser",false,{values:a.value,authenticatedUserOnly:false},Function.createDelegate(this,this._onSaveComplete),Function.createDelegate(this,this._onSaveFailed),[b,c,e,a.count])},_clonePropertyNames:function(e){var c=[],d={};for(var b=0;b0)a.append(",");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b[c],a,false,g)}a.append("]")}else{if(Date.isInstanceOfType(b)){a.append('"\\/Date(');a.append(b.getTime());a.append(')\\/"');break}var d=[],f=0;for(var e in b){if(e.startsWith("$"))continue;if(e===Sys.Serialization.JavaScriptSerializer._serverTypeFieldName&&f!==0){d[f++]=d[0];d[0]=e}else d[f++]=e}if(i)d.sort();a.append("{");var j=false;for(c=0;c + /// + /// + /// + /// + /// +}; +Sys.Mvc.InsertionMode.prototype = { + replace: 0, + insertBefore: 1, + insertAfter: 2 +} +Sys.Mvc.InsertionMode.registerEnum('Sys.Mvc.InsertionMode', false); + + +//////////////////////////////////////////////////////////////////////////////// +// Sys.Mvc.AjaxContext + +Sys.Mvc.AjaxContext = function Sys_Mvc_AjaxContext(request, updateTarget, loadingElement, insertionMode) { + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + this._request = request; + this._updateTarget = updateTarget; + this._loadingElement = loadingElement; + this._insertionMode = insertionMode; +} +Sys.Mvc.AjaxContext.prototype = { + _insertionMode: 0, + _loadingElement: null, + _response: null, + _request: null, + _updateTarget: null, + + get_data: function Sys_Mvc_AjaxContext$get_data() { + /// + if (this._response) { + return this._response.get_responseData(); + } + else { + return null; + } + }, + + get_insertionMode: function Sys_Mvc_AjaxContext$get_insertionMode() { + /// + return this._insertionMode; + }, + + get_loadingElement: function Sys_Mvc_AjaxContext$get_loadingElement() { + /// + return this._loadingElement; + }, + + get_response: function Sys_Mvc_AjaxContext$get_response() { + /// + return this._response; + }, + set_response: function Sys_Mvc_AjaxContext$set_response(value) { + /// + this._response = value; + return value; + }, + + get_request: function Sys_Mvc_AjaxContext$get_request() { + /// + return this._request; + }, + + get_updateTarget: function Sys_Mvc_AjaxContext$get_updateTarget() { + /// + return this._updateTarget; + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Sys.Mvc.AsyncHyperlink + +Sys.Mvc.AsyncHyperlink = function Sys_Mvc_AsyncHyperlink() { +} +Sys.Mvc.AsyncHyperlink.handleClick = function Sys_Mvc_AsyncHyperlink$handleClick(anchor, evt, ajaxOptions) { + /// + /// + /// + /// + /// + /// + evt.preventDefault(); + Sys.Mvc.MvcHelpers._asyncRequest(anchor.href, 'post', '', anchor, ajaxOptions); +} + + +//////////////////////////////////////////////////////////////////////////////// +// Sys.Mvc.MvcHelpers + +Sys.Mvc.MvcHelpers = function Sys_Mvc_MvcHelpers() { +} +Sys.Mvc.MvcHelpers._serializeForm = function Sys_Mvc_MvcHelpers$_serializeForm(form) { + /// + /// + /// + var formElements = form.elements; + var formBody = new Sys.StringBuilder(); + var count = formElements.length; + for (var i = 0; i < count; i++) { + var element = formElements[i]; + var name = element.name; + if (!name || !name.length) { + continue; + } + var tagName = element.tagName.toUpperCase(); + if (tagName === 'INPUT') { + var inputElement = element; + var type = inputElement.type; + if ((type === 'text') || (type === 'password') || (type === 'hidden') || (((type === 'checkbox') || (type === 'radio')) && element.checked)) { + formBody.append(encodeURIComponent(name)); + formBody.append('='); + formBody.append(encodeURIComponent(inputElement.value)); + formBody.append('&'); + } + } + else if (tagName === 'SELECT') { + var selectElement = element; + var optionCount = selectElement.options.length; + for (var j = 0; j < optionCount; j++) { + var optionElement = selectElement.options[j]; + if (optionElement.selected) { + formBody.append(encodeURIComponent(name)); + formBody.append('='); + formBody.append(encodeURIComponent(optionElement.value)); + formBody.append('&'); + } + } + } + else if (tagName === 'TEXTAREA') { + formBody.append(encodeURIComponent(name)); + formBody.append('='); + formBody.append(encodeURIComponent((element.value))); + formBody.append('&'); + } + } + return formBody.toString(); +} +Sys.Mvc.MvcHelpers._asyncRequest = function Sys_Mvc_MvcHelpers$_asyncRequest(url, verb, body, triggerElement, ajaxOptions) { + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + if (ajaxOptions.confirm) { + if (!confirm(ajaxOptions.confirm)) { + return; + } + } + if (ajaxOptions.url) { + url = ajaxOptions.url; + } + if (ajaxOptions.httpMethod) { + verb = ajaxOptions.httpMethod; + } + if (body.length > 0 && !body.endsWith('&')) { + body += '&'; + } + body += 'X-Requested-With=XMLHttpRequest'; + var requestBody = ''; + if (verb.toUpperCase() === 'GET' || verb.toUpperCase() === 'DELETE') { + if (url.indexOf('?') > -1) { + if (!url.endsWith('&')) { + url += '&'; + } + url += body; + } + else { + url += '?'; + url += body; + } + } + else { + requestBody = body; + } + var request = new Sys.Net.WebRequest(); + request.set_url(url); + request.set_httpVerb(verb); + request.set_body(requestBody); + if (verb.toUpperCase() === 'PUT') { + request.get_headers()['Content-Type'] = 'application/x-www-form-urlencoded;'; + } + request.get_headers()['X-Requested-With'] = 'XMLHttpRequest'; + var updateElement = null; + if (ajaxOptions.updateTargetId) { + updateElement = $get(ajaxOptions.updateTargetId); + } + var loadingElement = null; + if (ajaxOptions.loadingElementId) { + loadingElement = $get(ajaxOptions.loadingElementId); + } + var ajaxContext = new Sys.Mvc.AjaxContext(request, updateElement, loadingElement, ajaxOptions.insertionMode); + var continueRequest = true; + if (ajaxOptions.onBegin) { + continueRequest = ajaxOptions.onBegin(ajaxContext) !== false; + } + if (loadingElement) { + Sys.UI.DomElement.setVisible(ajaxContext.get_loadingElement(), true); + } + if (continueRequest) { + request.add_completed(Function.createDelegate(null, function(executor) { + Sys.Mvc.MvcHelpers._onComplete(request, ajaxOptions, ajaxContext); + })); + request.invoke(); + } +} +Sys.Mvc.MvcHelpers._onComplete = function Sys_Mvc_MvcHelpers$_onComplete(request, ajaxOptions, ajaxContext) { + /// + /// + /// + /// + /// + /// + ajaxContext.set_response(request.get_executor()); + if (ajaxOptions.onComplete && ajaxOptions.onComplete(ajaxContext) === false) { + return; + } + var statusCode = ajaxContext.get_response().get_statusCode(); + if ((statusCode >= 200 && statusCode < 300) || statusCode === 304 || statusCode === 1223) { + if (statusCode !== 204 && statusCode !== 304 && statusCode !== 1223) { + var contentType = ajaxContext.get_response().getResponseHeader('Content-Type'); + if ((contentType) && (contentType.indexOf('application/x-javascript') !== -1)) { + eval(ajaxContext.get_data()); + } + else { + Sys.Mvc.MvcHelpers.updateDomElement(ajaxContext.get_updateTarget(), ajaxContext.get_insertionMode(), ajaxContext.get_data()); + } + } + if (ajaxOptions.onSuccess) { + ajaxOptions.onSuccess(ajaxContext); + } + } + else { + if (ajaxOptions.onFailure) { + ajaxOptions.onFailure(ajaxContext); + } + } + if (ajaxContext.get_loadingElement()) { + Sys.UI.DomElement.setVisible(ajaxContext.get_loadingElement(), false); + } +} +Sys.Mvc.MvcHelpers.updateDomElement = function Sys_Mvc_MvcHelpers$updateDomElement(target, insertionMode, content) { + /// + /// + /// + /// + /// + /// + if (target) { + switch (insertionMode) { + case Sys.Mvc.InsertionMode.replace: + target.innerHTML = content; + break; + case Sys.Mvc.InsertionMode.insertBefore: + if (content && content.length > 0) { + target.innerHTML = content + target.innerHTML.trimStart(); + } + break; + case Sys.Mvc.InsertionMode.insertAfter: + if (content && content.length > 0) { + target.innerHTML = target.innerHTML.trimEnd() + content; + } + break; + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Sys.Mvc.AsyncForm + +Sys.Mvc.AsyncForm = function Sys_Mvc_AsyncForm() { +} +Sys.Mvc.AsyncForm.handleSubmit = function Sys_Mvc_AsyncForm$handleSubmit(form, evt, ajaxOptions) { + /// + /// + /// + /// + /// + /// + evt.preventDefault(); + var body = Sys.Mvc.MvcHelpers._serializeForm(form); + Sys.Mvc.MvcHelpers._asyncRequest(form.action, form.method || 'post', body, form, ajaxOptions); +} + + +Sys.Mvc.AjaxContext.registerClass('Sys.Mvc.AjaxContext'); +Sys.Mvc.AsyncHyperlink.registerClass('Sys.Mvc.AsyncHyperlink'); +Sys.Mvc.MvcHelpers.registerClass('Sys.Mvc.MvcHelpers'); +Sys.Mvc.AsyncForm.registerClass('Sys.Mvc.AsyncForm'); + +// ---- Do not remove this footer ---- +// Generated using Script# v0.5.0.0 (http://projects.nikhilk.net) +// ----------------------------------- diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/MicrosoftMvcAjax.js b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/MicrosoftMvcAjax.js new file mode 100644 index 00000000..6d6a7e82 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/MicrosoftMvcAjax.js @@ -0,0 +1,23 @@ +//---------------------------------------------------------- +// Copyright (C) Microsoft Corporation. All rights reserved. +//---------------------------------------------------------- +// MicrosoftMvcAjax.js + +Type.registerNamespace('Sys.Mvc');Sys.Mvc.$create_AjaxOptions=function(){return {};} +Sys.Mvc.InsertionMode=function(){};Sys.Mvc.InsertionMode.prototype = {replace:0,insertBefore:1,insertAfter:2} +Sys.Mvc.InsertionMode.registerEnum('Sys.Mvc.InsertionMode',false);Sys.Mvc.AjaxContext=function(request,updateTarget,loadingElement,insertionMode){this.$3=request;this.$4=updateTarget;this.$1=loadingElement;this.$0=insertionMode;} +Sys.Mvc.AjaxContext.prototype={$0:0,$1:null,$2:null,$3:null,$4:null,get_data:function(){if(this.$2){return this.$2.get_responseData();}else{return null;}},get_insertionMode:function(){return this.$0;},get_loadingElement:function(){return this.$1;},get_response:function(){return this.$2;},set_response:function(value){this.$2=value;return value;},get_request:function(){return this.$3;},get_updateTarget:function(){return this.$4;}} +Sys.Mvc.AsyncHyperlink=function(){} +Sys.Mvc.AsyncHyperlink.handleClick=function(anchor,evt,ajaxOptions){evt.preventDefault();Sys.Mvc.MvcHelpers.$1(anchor.href,'post','',anchor,ajaxOptions);} +Sys.Mvc.MvcHelpers=function(){} +Sys.Mvc.MvcHelpers.$0=function($p0){var $0=$p0.elements;var $1=new Sys.StringBuilder();var $2=$0.length;for(var $3=0;$3<$2;$3++){var $4=$0[$3];var $5=$4.name;if(!$5||!$5.length){continue;}var $6=$4.tagName.toUpperCase();if($6==='INPUT'){var $7=$4;var $8=$7.type;if(($8==='text')||($8==='password')||($8==='hidden')||((($8==='checkbox')||($8==='radio'))&&$4.checked)){$1.append(encodeURIComponent($5));$1.append('=');$1.append(encodeURIComponent($7.value));$1.append('&');}}else if($6==='SELECT'){var $9=$4;var $A=$9.options.length;for(var $B=0;$B<$A;$B++){var $C=$9.options[$B];if($C.selected){$1.append(encodeURIComponent($5));$1.append('=');$1.append(encodeURIComponent($C.value));$1.append('&');}}}else if($6==='TEXTAREA'){$1.append(encodeURIComponent($5));$1.append('=');$1.append(encodeURIComponent(($4.value)));$1.append('&');}}return $1.toString();} +Sys.Mvc.MvcHelpers.$1=function($p0,$p1,$p2,$p3,$p4){if($p4.confirm){if(!confirm($p4.confirm)){return;}}if($p4.url){$p0=$p4.url;}if($p4.httpMethod){$p1=$p4.httpMethod;}if($p2.length>0&&!$p2.endsWith('&')){$p2+='&';}$p2+='X-Requested-With=XMLHttpRequest';var $0='';if($p1.toUpperCase()==='GET'||$p1.toUpperCase()==='DELETE'){if($p0.indexOf('?')>-1){if(!$p0.endsWith('&')){$p0+='&';}$p0+=$p2;}else{$p0+='?';$p0+=$p2;}}else{$0=$p2;}var $1=new Sys.Net.WebRequest();$1.set_url($p0);$1.set_httpVerb($p1);$1.set_body($0);if($p1.toUpperCase()==='PUT'){$1.get_headers()['Content-Type']='application/x-www-form-urlencoded;';}$1.get_headers()['X-Requested-With']='XMLHttpRequest';var $2=null;if($p4.updateTargetId){$2=$get($p4.updateTargetId);}var $3=null;if($p4.loadingElementId){$3=$get($p4.loadingElementId);}var $4=new Sys.Mvc.AjaxContext($1,$2,$3,$p4.insertionMode);var $5=true;if($p4.onBegin){$5=$p4.onBegin($4)!==false;}if($3){Sys.UI.DomElement.setVisible($4.get_loadingElement(),true);}if($5){$1.add_completed(Function.createDelegate(null,function($p1_0){ +Sys.Mvc.MvcHelpers.$2($1,$p4,$4);}));$1.invoke();}} +Sys.Mvc.MvcHelpers.$2=function($p0,$p1,$p2){$p2.set_response($p0.get_executor());if($p1.onComplete&&$p1.onComplete($p2)===false){return;}var $0=$p2.get_response().get_statusCode();if(($0>=200&&$0<300)||$0===304||$0===1223){if($0!==204&&$0!==304&&$0!==1223){var $1=$p2.get_response().getResponseHeader('Content-Type');if(($1)&&($1.indexOf('application/x-javascript')!==-1)){eval($p2.get_data());}else{Sys.Mvc.MvcHelpers.updateDomElement($p2.get_updateTarget(),$p2.get_insertionMode(),$p2.get_data());}}if($p1.onSuccess){$p1.onSuccess($p2);}}else{if($p1.onFailure){$p1.onFailure($p2);}}if($p2.get_loadingElement()){Sys.UI.DomElement.setVisible($p2.get_loadingElement(),false);}} +Sys.Mvc.MvcHelpers.updateDomElement=function(target,insertionMode,content){if(target){switch(insertionMode){case 0:target.innerHTML=content;break;case 1:if(content&&content.length>0){target.innerHTML=content+target.innerHTML.trimStart();}break;case 2:if(content&&content.length>0){target.innerHTML=target.innerHTML.trimEnd()+content;}break;}}} +Sys.Mvc.AsyncForm=function(){} +Sys.Mvc.AsyncForm.handleSubmit=function(form,evt,ajaxOptions){evt.preventDefault();var $0=Sys.Mvc.MvcHelpers.$0(form);Sys.Mvc.MvcHelpers.$1(form.action,form.method||'post',$0,form,ajaxOptions);} +Sys.Mvc.AjaxContext.registerClass('Sys.Mvc.AjaxContext');Sys.Mvc.AsyncHyperlink.registerClass('Sys.Mvc.AsyncHyperlink');Sys.Mvc.MvcHelpers.registerClass('Sys.Mvc.MvcHelpers');Sys.Mvc.AsyncForm.registerClass('Sys.Mvc.AsyncForm'); +// ---- Do not remove this footer ---- +// Generated using Script# v0.5.0.0 (http://projects.nikhilk.net) +// ----------------------------------- diff --git a/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/jquery-1.3.2-vsdoc.js b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/jquery-1.3.2-vsdoc.js new file mode 100644 index 00000000..27aefb87 --- /dev/null +++ b/SparkleShare/Windows/tools/gettext-cs-utils/Gettext.CsUtils/Samples/Gettext.Samples.Mvc/Scripts/jquery-1.3.2-vsdoc.js @@ -0,0 +1,6255 @@ +/* + * This file has been commented to support Visual Studio Intellisense. + * You should not use this file at runtime inside the browser--it is only + * intended to be used only for design-time IntelliSense. Please use the + * standard jQuery library for all production use. + * + * Comment version: 1.3.2a + */ + +/* + * jQuery JavaScript Library v1.3.2 + * + * Copyright (c) 2009 John Resig, http://jquery.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. + * + * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) + * Revision: 6246 + */ + +(function(){ + +var + // Will speed up references to window, and allows munging its name. + window = this, + // Will speed up references to undefined, and allows munging its name. + undefined, + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + // Map over the $ in case of overwrite + _$ = window.$, + + jQuery = window.jQuery = window.$ = function(selector, context) { + /// + /// 1: $(expression, context) - This function accepts a string containing a CSS selector which is then used to match a set of elements. + /// 2: $(html) - Create DOM elements on-the-fly from the provided String of raw HTML. + /// 3: $(elements) - Wrap jQuery functionality around a single or multiple DOM Element(s). + /// 4: $(callback) - A shorthand for $(document).ready(). + /// + /// + /// 1: expression - An expression to search with. + /// 2: html - A string of HTML to create on the fly. + /// 3: elements - DOM element(s) to be encapsulated by a jQuery object. + /// 4: callback - The function to execute when the DOM is ready. + /// + /// + /// 1: context - A DOM Element, Document or jQuery to use as context. + /// + /// + /// The DOM node context originally passed to jQuery() (if none was passed then context will be equal to the document). + /// + /// + /// A selector representing selector originally passed to jQuery(). + /// + /// + + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context ); + }, + + // A simple way to check for HTML strings or ID strings + // (both of which we optimize for) + quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/, + // Is it a simple selector + isSimple = /^.[^:#\[\.,]*$/; + +jQuery.fn = jQuery.prototype = { + init: function( selector, context ) { + /// + /// 1: $(expression, context) - This function accepts a string containing a CSS selector which is then used to match a set of elements. + /// 2: $(html) - Create DOM elements on-the-fly from the provided String of raw HTML. + /// 3: $(elements) - Wrap jQuery functionality around a single or multiple DOM Element(s). + /// 4: $(callback) - A shorthand for $(document).ready(). + /// + /// + /// 1: expression - An expression to search with. + /// 2: html - A string of HTML to create on the fly. + /// 3: elements - DOM element(s) to be encapsulated by a jQuery object. + /// 4: callback - The function to execute when the DOM is ready. + /// + /// + /// 1: context - A DOM Element, Document or jQuery to use as context. + /// + /// + + // Make sure that a selection was provided + selector = selector || document; + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this[0] = selector; + this.length = 1; + this.context = selector; + return this; + } + // Handle HTML strings + if (typeof selector === "string") { + // Are we dealing with HTML string or an ID? + var match = quickExpr.exec(selector); + + // Verify a match, and that no context was specified for #id + if (match && (match[1] || !context)) { + + // HANDLE: $(html) -> $(array) + if (match[1]) + selector = jQuery.clean([match[1]], context); + + // HANDLE: $("#id") + else { + var elem = document.getElementById(match[3]); + + // Handle the case where IE and Opera return items + // by name instead of ID + if (elem && elem.id != match[3]) + return jQuery().find(selector); + + // Otherwise, we inject the element directly into the jQuery object + var ret = jQuery(elem || []); + ret.context = document; + ret.selector = selector; + return ret; + } + + // HANDLE: $(expr, [context]) + // (which is just equivalent to: $(content).find(expr) + } else + return jQuery(context).find(selector); + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) + return jQuery( document ).ready( selector ); + + // Make sure that old selector state is passed along + if ( selector.selector && selector.context ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return this.setArray(jQuery.isArray( selector ) ? + selector : + jQuery.makeArray(selector)); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.3.2", + + // The number of elements contained in the matched element set + size: function() { + /// + /// The number of elements currently matched. + /// Part of Core + /// + /// + + return this.length; + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + /// + /// Access a single matched element. num is used to access the + /// Nth element matched. + /// Part of Core + /// + /// + /// + /// Access the element in the Nth position. + /// + + return num == undefined ? + + // Return a 'clean' array + Array.prototype.slice.call( this ) : + + // Return just the object + this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + /// + /// Set the jQuery object to an array of elements, while maintaining + /// the stack. + /// Part of Core + /// + /// + /// + /// An array of elements + /// + + // Build a new jQuery matched element set + var ret = jQuery( elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) + ret.selector = this.selector + (this.selector ? " " : "") + selector; + else if ( name ) + ret.selector = this.selector + "." + name + "(" + selector + ")"; + + // Return the newly-formed element set + return ret; + }, + + // Force the current matched set of elements to become + // the specified array of elements (destroying the stack in the process) + // You should use pushStack() in order to do this, but maintain the stack + setArray: function( elems ) { + /// + /// Set the jQuery object to an array of elements. This operation is + /// completely destructive - be sure to use .pushStack() if you wish to maintain + /// the jQuery stack. + /// Part of Core + /// + /// + /// + /// An array of elements + /// + + // Resetting the length to 0, then using the native Array push + // is a super-fast way to populate an object with array-like properties + this.length = 0; + Array.prototype.push.apply( this, elems ); + + return this; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + /// + /// Execute a function within the context of every matched element. + /// This means that every time the passed-in function is executed + /// (which is once for every element matched) the 'this' keyword + /// points to the specific element. + /// Additionally, the function, when executed, is passed a single + /// argument representing the position of the element in the matched + /// set. + /// Part of Core + /// + /// + /// + /// A function to execute + /// + + return jQuery.each( this, callback, args ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + /// + /// Searches every matched element for the object and returns + /// the index of the element, if found, starting with zero. + /// Returns -1 if the object wasn't found. + /// Part of Core + /// + /// + /// + /// Object to search for + /// + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem && elem.jquery ? elem[0] : elem + , this ); + }, + + attr: function( name, value, type ) { + /// + /// Set a single property to a computed value, on all matched elements. + /// Instead of a value, a function is provided, that computes the value. + /// Part of DOM/Attributes + /// + /// + /// + /// The name of the property to set. + /// + /// + /// A function returning the value to set. + /// + + var options = name; + + // Look for the case where we're accessing a style value + if ( typeof name === "string" ) + if ( value === undefined ) + return this[0] && jQuery[ type || "attr" ]( this[0], name ); + + else { + options = {}; + options[ name ] = value; + } + + // Check to see if we're setting style values + return this.each(function(i){ + // Set all the styles + for ( name in options ) + jQuery.attr( + type ? + this.style : + this, + name, jQuery.prop( this, options[ name ], type, i, name ) + ); + }); + }, + + css: function( key, value ) { + /// + /// Set a single style property to a value, on all matched elements. + /// If a number is provided, it is automatically converted into a pixel value. + /// Part of CSS + /// + /// + /// + /// The name of the property to set. + /// + /// + /// The value to set the property to. + /// + + // ignore negative width and height values + if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) + value = undefined; + return this.attr( key, value, "curCSS" ); + }, + + text: function( text ) { + /// + /// Set the text contents of all matched elements. + /// Similar to html(), but escapes HTML (replace "<" and ">" with their + /// HTML entities). + /// Part of DOM/Attributes + /// + /// + /// + /// The text value to set the contents of the element to. + /// + + if ( typeof text !== "object" && text != null ) + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); + + var ret = ""; + + jQuery.each( text || this, function(){ + jQuery.each( this.childNodes, function(){ + if ( this.nodeType != 8 ) + ret += this.nodeType != 1 ? + this.nodeValue : + jQuery.fn.text( [ this ] ); + }); + }); + + return ret; + }, + + wrapAll: function( html ) { + /// + /// Wrap all matched elements with a structure of other elements. + /// This wrapping process is most useful for injecting additional + /// stucture into a document, without ruining the original semantic + /// qualities of a document. + /// This works by going through the first element + /// provided and finding the deepest ancestor element within its + /// structure - it is that element that will en-wrap everything else. + /// This does not work with elements that contain text. Any necessary text + /// must be added after the wrapping is done. + /// Part of DOM/Manipulation + /// + /// + /// + /// A DOM element that will be wrapped around the target. + /// + + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).clone(); + + if ( this[0].parentNode ) + wrap.insertBefore( this[0] ); + + wrap.map(function(){ + var elem = this; + + while ( elem.firstChild ) + elem = elem.firstChild; + + return elem; + }).append(this); + } + + return this; + }, + + wrapInner: function( html ) { + /// + /// Wraps the inner child contents of each matched elemenht (including text nodes) with an HTML structure. + /// + /// + /// A string of HTML or a DOM element that will be wrapped around the target contents. + /// + /// + + return this.each(function(){ + jQuery( this ).contents().wrapAll( html ); + }); + }, + + wrap: function( html ) { + /// + /// Wrap all matched elements with a structure of other elements. + /// This wrapping process is most useful for injecting additional + /// stucture into a document, without ruining the original semantic + /// qualities of a document. + /// This works by going through the first element + /// provided and finding the deepest ancestor element within its + /// structure - it is that element that will en-wrap everything else. + /// This does not work with elements that contain text. Any necessary text + /// must be added after the wrapping is done. + /// Part of DOM/Manipulation + /// + /// + /// + /// A DOM element that will be wrapped around the target. + /// + + return this.each(function(){ + jQuery( this ).wrapAll( html ); + }); + }, + + append: function() { + /// + /// Append content to the inside of every matched element. + /// This operation is similar to doing an appendChild to all the + /// specified elements, adding them into the document. + /// Part of DOM/Manipulation + /// + /// + /// + /// Content to append to the target + /// + + return this.domManip(arguments, true, function(elem){ + if (this.nodeType == 1) + this.appendChild( elem ); + }); + }, + + prepend: function() { + /// + /// Prepend content to the inside of every matched element. + /// This operation is the best way to insert elements + /// inside, at the beginning, of all matched elements. + /// Part of DOM/Manipulation + /// + /// + /// + /// Content to prepend to the target. + /// + + return this.domManip(arguments, true, function(elem){ + if (this.nodeType == 1) + this.insertBefore( elem, this.firstChild ); + }); + }, + + before: function() { + /// + /// Insert content before each of the matched elements. + /// Part of DOM/Manipulation + /// + /// + /// + /// Content to insert before each target. + /// + + return this.domManip(arguments, false, function(elem){ + this.parentNode.insertBefore( elem, this ); + }); + }, + + after: function() { + /// + /// Insert content after each of the matched elements. + /// Part of DOM/Manipulation + /// + /// + /// + /// Content to insert after each target. + /// + + return this.domManip(arguments, false, function(elem){ + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + }, + + end: function() { + /// + /// End the most recent 'destructive' operation, reverting the list of matched elements + /// back to its previous state. After an end operation, the list of matched elements will + /// revert to the last state of matched elements. + /// If there was no destructive operation before, an empty set is returned. + /// Part of DOM/Traversing + /// + /// + + return this.prevObject || jQuery( [] ); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: [].push, + sort: [].sort, + splice: [].splice, + + find: function( selector ) { + /// + /// Searches for all elements that match the specified expression. + /// This method is a good way to find additional descendant + /// elements with which to process. + /// All searching is done using a jQuery expression. The expression can be + /// written using CSS 1-3 Selector syntax, or basic XPath. + /// Part of DOM/Traversing + /// + /// + /// + /// An expression to search with. + /// + /// + + if ( this.length === 1 ) { + var ret = this.pushStack( [], "find", selector ); + ret.length = 0; + jQuery.find( selector, this[0], ret ); + return ret; + } else { + return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){ + return jQuery.find( selector, elem ); + })), "find", selector ); + } + }, + + clone: function( events ) { + /// + /// Clone matched DOM Elements and select the clones. + /// This is useful for moving copies of the elements to another + /// location in the DOM. + /// Part of DOM/Manipulation + /// + /// + /// + /// (Optional) Set to false if you don't want to clone all descendant nodes, in addition to the element itself. + /// + + // Do the clone + var ret = this.map(function(){ + if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) { + // IE copies events bound via attachEvent when + // using cloneNode. Calling detachEvent on the + // clone will also remove the events from the orignal + // In order to get around this, we use innerHTML. + // Unfortunately, this means some modifications to + // attributes in IE that are actually only stored + // as properties will not be copied (such as the + // the name attribute on an input). + var html = this.outerHTML; + if ( !html ) { + var div = this.ownerDocument.createElement("div"); + div.appendChild( this.cloneNode(true) ); + html = div.innerHTML; + } + + return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0]; + } else + return this.cloneNode(true); + }); + + // Copy the events from the original to the clone + if ( events === true ) { + var orig = this.find("*").andSelf(), i = 0; + + ret.find("*").andSelf().each(function(){ + if ( this.nodeName !== orig[i].nodeName ) + return; + + var events = jQuery.data( orig[i], "events" ); + + for ( var type in events ) { + for ( var handler in events[ type ] ) { + jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data ); + } + } + + i++; + }); + } + + // Return the cloned set + return ret; + }, + + filter: function( selector ) { + /// + /// Removes all elements from the set of matched elements that do not + /// pass the specified filter. This method is used to narrow down + /// the results of a search. + /// }) + /// Part of DOM/Traversing + /// + /// + /// + /// A function to use for filtering + /// + /// + + return this.pushStack( + jQuery.isFunction( selector ) && + jQuery.grep(this, function(elem, i){ + return selector.call( elem, i ); + }) || + + jQuery.multiFilter( selector, jQuery.grep(this, function(elem){ + return elem.nodeType === 1; + }) ), "filter", selector ); + }, + + closest: function( selector ) { + /// + /// Get a set of elements containing the closest parent element that matches the specified selector, the starting element included. + /// + /// + /// + /// An expression to filter the elements with. + /// + /// + + var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null, + closer = 0; + + return this.map(function(){ + var cur = this; + while ( cur && cur.ownerDocument ) { + if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) { + jQuery.data(cur, "closest", closer); + return cur; + } + cur = cur.parentNode; + closer++; + } + }); + }, + + not: function( selector ) { + /// + /// Removes any elements inside the array of elements from the set + /// of matched elements. This method is used to remove one or more + /// elements from a jQuery object. + /// Part of DOM/Traversing + /// + /// + /// A set of elements to remove from the jQuery set of matched elements. + /// + /// + + if ( typeof selector === "string" ) + // test special case where just one selector is passed in + if ( isSimple.test( selector ) ) + return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector ); + else + selector = jQuery.multiFilter( selector, this ); + + var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; + return this.filter(function() { + return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; + }); + }, + + add: function( selector ) { + /// + /// Adds one or more Elements to the set of matched elements. + /// Part of DOM/Traversing + /// + /// + /// One or more Elements to add + /// + /// + + return this.pushStack( jQuery.unique( jQuery.merge( + this.get(), + typeof selector === "string" ? + jQuery( selector ) : + jQuery.makeArray( selector ) + ))); + }, + + is: function( selector ) { + /// + /// Checks the current selection against an expression and returns true, + /// if at least one element of the selection fits the given expression. + /// Does return false, if no element fits or the expression is not valid. + /// filter(String) is used internally, therefore all rules that apply there + /// apply here, too. + /// Part of DOM/Traversing + /// + /// + /// + /// The expression with which to filter + /// + + return !!selector && jQuery.multiFilter( selector, this ).length > 0; + }, + + hasClass: function( selector ) { + /// + /// Checks the current selection against a class and returns whether at least one selection has a given class. + /// + /// The class to check against + /// True if at least one element in the selection has the class, otherwise false. + + return !!selector && this.is( "." + selector ); + }, + + val: function( value ) { + /// + /// Set the value of every matched element. + /// Part of DOM/Attributes + /// + /// + /// + /// Set the property to the specified value. + /// + + if ( value === undefined ) { + var elem = this[0]; + + if ( elem ) { + if( jQuery.nodeName( elem, 'option' ) ) + return (elem.attributes.value || {}).specified ? elem.value : elem.text; + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type == "select-one"; + + // Nothing was selected + if ( index < 0 ) + return null; + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + if ( option.selected ) { + // Get the specifc value for the option + value = jQuery(option).val(); + + // We don't need an array for one selects + if ( one ) + return value; + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + } + + // Everything else, we just grab the value + return (elem.value || "").replace(/\r/g, ""); + + } + + return undefined; + } + + if ( typeof value === "number" ) + value += ''; + + return this.each(function(){ + if ( this.nodeType != 1 ) + return; + + if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) ) + this.checked = (jQuery.inArray(this.value, value) >= 0 || + jQuery.inArray(this.name, value) >= 0); + + else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(value); + + jQuery( "option", this ).each(function(){ + this.selected = (jQuery.inArray( this.value, values ) >= 0 || + jQuery.inArray( this.text, values ) >= 0); + }); + + if ( !values.length ) + this.selectedIndex = -1; + + } else + this.value = value; + }); + }, + + html: function( value ) { + /// + /// Set the html contents of every matched element. + /// This property is not available on XML documents. + /// Part of DOM/Attributes + /// + /// + /// + /// Set the html contents to the specified value. + /// + + return value === undefined ? + (this[0] ? + this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") : + null) : + this.empty().append( value ); + }, + + replaceWith: function( value ) { + /// + /// Replaces all matched element with the specified HTML or DOM elements. + /// + /// + /// The content with which to replace the matched elements. + /// + /// The element that was just replaced. + + return this.after( value ).remove(); + }, + + eq: function( i ) { + /// + /// Reduce the set of matched elements to a single element. + /// The position of the element in the set of matched elements + /// starts at 0 and goes to length - 1. + /// Part of Core + /// + /// + /// + /// pos The index of the element that you wish to limit to. + /// + + return this.slice( i, +i + 1 ); + }, + + slice: function() { + /// + /// Selects a subset of the matched elements. Behaves exactly like the built-in Array slice method. + /// + /// Where to start the subset (0-based). + /// Where to end the subset (not including the end element itself). + /// If omitted, ends at the end of the selection + /// The sliced elements + + return this.pushStack( Array.prototype.slice.apply( this, arguments ), + "slice", Array.prototype.slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + /// + /// This member is internal. + /// + /// + /// + + return this.pushStack( jQuery.map(this, function(elem, i){ + return callback.call( elem, i, elem ); + })); + }, + + andSelf: function() { + /// + /// Adds the previous selection to the current selection. + /// + /// + + return this.add( this.prevObject ); + }, + + domManip: function( args, table, callback ) { + /// + /// Args + /// + /// + /// Insert TBODY in TABLEs if one is not found. + /// + /// + /// If dir<0, process args in reverse order. + /// + /// + /// The function doing the DOM manipulation. + /// + /// + /// + /// Part of Core + /// + + if ( this[0] ) { + var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(), + scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ), + first = fragment.firstChild; + + if ( first ) + for ( var i = 0, l = this.length; i < l; i++ ) + callback.call( root(this[i], first), this.length > 1 || i > 0 ? + fragment.cloneNode(true) : fragment ); + + if ( scripts ) + jQuery.each( scripts, evalScript ); + } + + return this; + + function root( elem, cur ) { + return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ? + (elem.getElementsByTagName("tbody")[0] || + elem.appendChild(elem.ownerDocument.createElement("tbody"))) : + elem; + } + } +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +function evalScript( i, elem ) { + /// + /// This method is internal. + /// + /// + + if ( elem.src ) + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); + + else + jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); + + if ( elem.parentNode ) + elem.parentNode.removeChild( elem ); +} + +function now(){ + /// + /// Gets the current date. + /// + /// The current date. + return +new Date; +} + +jQuery.extend = jQuery.fn.extend = function() { + /// + /// Extend one object with one or more others, returning the original, + /// modified, object. This is a great utility for simple inheritance. + /// jQuery.extend(settings, options); + /// var settings = jQuery.extend({}, defaults, options); + /// Part of JavaScript + /// + /// + /// The object to extend + /// + /// + /// The object that will be merged into the first. + /// + /// + /// (optional) More objects to merge into the first + /// + /// + + // copy reference to target object + var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) + target = {}; + + // extend jQuery itself if only one argument is passed + if ( length == i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) + // Extend the base object + for ( var name in options ) { + var src = target[ name ], copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) + continue; + + // Recurse if we're merging object values + if ( deep && copy && typeof copy === "object" && !copy.nodeType ) + target[ name ] = jQuery.extend( deep, + // Never move original objects, clone them + src || ( copy.length != null ? [ ] : { } ) + , copy ); + + // Don't bring in undefined values + else if ( copy !== undefined ) + target[ name ] = copy; + + } + + // Return the modified object + return target; +}; + +// exclude the following css properties to add px +var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, + // cache defaultView + defaultView = document.defaultView || {}, + toString = Object.prototype.toString; + +jQuery.extend({ + noConflict: function( deep ) { + /// + /// Run this function to give control of the $ variable back + /// to whichever library first implemented it. This helps to make + /// sure that jQuery doesn't conflict with the $ object + /// of other libraries. + /// By using this function, you will only be able to access jQuery + /// using the 'jQuery' variable. For example, where you used to do + /// $("div p"), you now must do jQuery("div p"). + /// Part of Core + /// + /// + + window.$ = _$; + + if ( deep ) + window.jQuery = _jQuery; + + return jQuery; + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + /// + /// Determines if the parameter passed is a function. + /// + /// The object to check + /// True if the parameter is a function; otherwise false. + + return toString.call(obj) === "[object Function]"; + }, + + isArray: function(obj) { + /// + /// Determine if the parameter passed is an array. + /// + /// Object to test whether or not it is an array. + /// True if the parameter is a function; otherwise false. + + return toString.call(obj) === "[object Array]"; + }, + + // check if an element is in a (or is an) XML document + isXMLDoc: function( elem ) { + /// + /// Determines if the parameter passed is an XML document. + /// + /// The object to test + /// True if the parameter is an XML document; otherwise false. + + return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || + !!elem.ownerDocument && jQuery.isXMLDoc(elem.ownerDocument); + }, + + // Evalulates a script in a global context + globalEval: function( data ) { + /// + /// Internally evaluates a script in a global context. + /// + /// + + if ( data && /\S/.test(data) ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.getElementsByTagName("head")[0] || document.documentElement, + script = document.createElement("script"); + + script.type = "text/javascript"; + if ( jQuery.support.scriptEval ) + script.appendChild( document.createTextNode( data ) ); + else + script.text = data; + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + /// + /// Checks whether the specified element has the specified DOM node name. + /// + /// The element to examine + /// The node name to check + /// True if the specified node name matches the node's DOM node name; otherwise false + + return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + /// + /// A generic iterator function, which can be used to seemlessly + /// iterate over both objects and arrays. This function is not the same + /// as $().each() - which is used to iterate, exclusively, over a jQuery + /// object. This function can be used to iterate over anything. + /// The callback has two arguments:the key (objects) or index (arrays) as first + /// the first, and the value as the second. + /// Part of JavaScript + /// + /// + /// The object, or array, to iterate over. + /// + /// + /// The function that will be executed on every object. + /// + /// + + var name, i = 0, length = object.length; + + if ( args ) { + if ( length === undefined ) { + for ( name in object ) + if ( callback.apply( object[ name ], args ) === false ) + break; + } else + for ( ; i < length; ) + if ( callback.apply( object[ i++ ], args ) === false ) + break; + + // A special, fast, case for the most common use of each + } else { + if ( length === undefined ) { + for ( name in object ) + if ( callback.call( object[ name ], name, object[ name ] ) === false ) + break; + } else + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} + } + + return object; + }, + + prop: function( elem, value, type, i, name ) { + /// + /// This method is internal. + /// + /// + // This member is not documented within the jQuery API: http://docs.jquery.com/action/edit/Internals/jQuery.prop + + // Handle executable functions + if ( jQuery.isFunction( value ) ) + value = value.call( elem, i ); + + // Handle passing in a number to a CSS property + return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ? + value + "px" : + value; + }, + + className: { + // internal only, use addClass("class") + add: function( elem, classNames ) { + /// + /// Internal use only; use addClass('class') + /// + /// + + jQuery.each((classNames || "").split(/\s+/), function(i, className){ + if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) + elem.className += (elem.className ? " " : "") + className; + }); + }, + + // internal only, use removeClass("class") + remove: function( elem, classNames ) { + /// + /// Internal use only; use removeClass('class') + /// + /// + + if (elem.nodeType == 1) + elem.className = classNames !== undefined ? + jQuery.grep(elem.className.split(/\s+/), function(className){ + return !jQuery.className.has( classNames, className ); + }).join(" ") : + ""; + }, + + // internal only, use hasClass("class") + has: function( elem, className ) { + /// + /// Internal use only; use hasClass('class') + /// + /// + + return elem && jQuery.inArray(className, (elem.className || elem).toString().split(/\s+/)) > -1; + } + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + /// + /// Swap in/out style options. + /// + + var old = {}; + // Remember the old values, and insert the new ones + for ( var name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + callback.call( elem ); + + // Revert the old values + for ( var name in options ) + elem.style[ name ] = old[ name ]; + }, + + css: function( elem, name, force, extra ) { + /// + /// This method is internal only. + /// + /// + // This method is undocumented in jQuery API: http://docs.jquery.com/action/edit/Internals/jQuery.css + + if ( name == "width" || name == "height" ) { + var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; + + function getWH() { + val = name == "width" ? elem.offsetWidth : elem.offsetHeight; + + if ( extra === "border" ) + return; + + jQuery.each( which, function() { + if ( !extra ) + val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; + if ( extra === "margin" ) + val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0; + else + val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; + }); + } + + if ( elem.offsetWidth !== 0 ) + getWH(); + else + jQuery.swap( elem, props, getWH ); + + return Math.max(0, Math.round(val)); + } + + return jQuery.curCSS( elem, name, force ); + }, + + curCSS: function( elem, name, force ) { + /// + /// This method is internal only. + /// + /// + // This method is undocumented in jQuery API: http://docs.jquery.com/action/edit/Internals/jQuery.curCSS + + var ret, style = elem.style; + + // We need to handle opacity special in IE + if ( name == "opacity" && !jQuery.support.opacity ) { + ret = jQuery.attr( style, "opacity" ); + + return ret == "" ? + "1" : + ret; + } + + // Make sure we're using the right name for getting the float value + if ( name.match( /float/i ) ) + name = styleFloat; + + if ( !force && style && style[ name ] ) + ret = style[ name ]; + + else if ( defaultView.getComputedStyle ) { + + // Only "float" is needed here + if ( name.match( /float/i ) ) + name = "float"; + + name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); + + var computedStyle = defaultView.getComputedStyle( elem, null ); + + if ( computedStyle ) + ret = computedStyle.getPropertyValue( name ); + + // We should always get a number back from opacity + if ( name == "opacity" && ret == "" ) + ret = "1"; + + } else if ( elem.currentStyle ) { + var camelCase = name.replace(/\-(\w)/g, function(all, letter){ + return letter.toUpperCase(); + }); + + ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { + // Remember the original values + var left = style.left, rsLeft = elem.runtimeStyle.left; + + // Put in the new values to get a computed value out + elem.runtimeStyle.left = elem.currentStyle.left; + style.left = ret || 0; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + elem.runtimeStyle.left = rsLeft; + } + } + + return ret; + }, + + clean: function( elems, context, fragment ) { + /// + /// This method is internal only. + /// + /// + // This method is undocumented in the jQuery API: http://docs.jquery.com/action/edit/Internals/jQuery.clean + + + context = context || document; + + // !context.createElement fails in IE with an error but returns typeof 'object' + if ( typeof context.createElement === "undefined" ) + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) { + var match = /^<(\w+)\s*\/?>$/.exec(elems[0]); + if ( match ) + return [ context.createElement( match[1] ) ]; + } + + var ret = [], scripts = [], div = context.createElement("div"); + + jQuery.each(elems, function(i, elem){ + if ( typeof elem === "number" ) + elem += ''; + + if ( !elem ) + return; + + // Convert html string into DOM nodes + if ( typeof elem === "string" ) { + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ + return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? + all : + front + ">"; + }); + + // Trim whitespace, otherwise indexOf won't work as expected + var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase(); + + var wrap = + // option or optgroup + !tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && + [ 1, "", "
" ] || + + !tags.indexOf("", "" ] || + + // matched above + (!tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + // IE can't serialize and