public IList <PackageIndexError> AddPackage(IPackageMetadata package, bool force) { try { if (package == null) { return(null); } // check if package exists in the index: // - if it does not, proceed and add it // - if it is, add to index only if new package has higher version var existingPackage = GetPackages(package.Id).FirstOrDefault(); if (existingPackage != null) { var existingPackageVersion = new SemanticVersion(existingPackage.Version); var newPackageVersion = new SemanticVersion(package.Version); if (existingPackageVersion >= newPackageVersion && !force) { Logger.WriteVerbose("More recent version {0} of package {1} {2} exists in the index. Skipping...", existingPackageVersion.ToString(), package.Id, package.Version); return(new List <PackageIndexError>()); } else { // Remove all old packages types. This is for the case if new package does not // contain some types (deprecated), in this case index would still keep them. Logger.WriteVerbose("Older version {0} of package {1} {2} exists in the index. Removing from index...", existingPackageVersion.ToString(), package.Id, package.Version); RemovePackage(package.Id); } } Logger.WriteInformation("Adding package {0} {1} to index.", package.Id, package.Version); var reflector = ReflectorFactory.Create(package); foreach (var assembly in package.Assemblies) { Logger.WriteVerbose("Processing assembly {0}.", assembly.FullPath); reflector.ProcessAssembly(assembly); } Logger.WriteVerbose("Storing package model to the index."); var result = Engine.AddEntry( new PackageModel { Name = package.Id, Version = package.Version.ToString(), Path = package.LocalPath }); Logger.WriteVerbose("Storing type models to the index."); result.AddRange(Engine.AddEntries(reflector.Types, false)); Logger.WriteVerbose("Storing namespaces to the index."); result.AddRange(Engine.AddEntries(reflector.Namespaces, false)); Logger.WriteVerbose("Storing extensions to the index."); result.AddRange(Engine.AddEntries(reflector.Extensions, true)); Logger.WriteVerbose("Package indexing complete."); return(result); } catch (Exception e) { Debug.Write(e.ToString()); } return(null); }
static void Main(string[] args) { var reflector = ReflectorFactory.CreateReflectorB(); var thinReflector = ReflectorFactory.CreateThinReflectorB(); ThinRotor thinRotor = RotorFactory.CreateRotorBeta(); Rotor slowRotor = RotorFactory.CreateRotorI(); Rotor middleRotor = RotorFactory.CreateRotorII(); Rotor fastRotor = RotorFactory.CreateRotorIII(); var spindle = new Spindle(reflector, slowRotor, middleRotor, fastRotor); //var spindle = new Spindle(thinReflector, thinRotor, slowRotor, middleRotor, fastRotor); // Ringstellung. thinRotor.Offset = ToI('A'); slowRotor.Offset = ToI('A'); middleRotor.Offset = ToI('A'); fastRotor.Offset = ToI('A'); const char thinRotorPosition = 'A'; const char slowRotorPosition = 'A'; const char middleRotorPosition = 'A'; const char fastRotorPosition = 'A'; // Initial positions. thinRotor.Position = ToI(thinRotorPosition); slowRotor.Position = ToI(slowRotorPosition); middleRotor.Position = ToI(middleRotorPosition); fastRotor.Position = ToI(fastRotorPosition); // Note: Enigma can only encrypt/decrypt the 26 letters of the alphabet. // (because of this all others: spaces, quotes, commas etc. are ignored) string plain = "The quick brown fox jumps over the lazy dog."; var plugs = new Dictionary <int, int> { //{ ToI('A'), ToI('B') }, //{ ToI('C'), ToI('D') }, //{ ToI('E'), ToI('F') }, //{ ToI('G'), ToI('H') }, //{ ToI('I'), ToI('J') }, //{ ToI('K'), ToI('L') }, //{ ToI('M'), ToI('N') }, //{ ToI('O'), ToI('P') }, //{ ToI('Q'), ToI('R') }, //{ ToI('S'), ToI('T') }, //{ ToI('U'), ToI('V') }, //{ ToI('W'), ToI('X') }, //{ ToI('Y'), ToI('Z') }, }; var plugboard = new Plugboard(spindle, plugs); string encrypted = String.Empty; Console.WriteLine("Encrypted:"); // Encrypt. foreach (char c in plain) { int input = ToI(c); if ((input < 0) || (input > 25)) { // We cannot process this char. continue; } var output = plugboard.Get(input); var ch = Convert.ToChar('A' + output); encrypted += ch; Console.Write(ch); Console.Write(' '); } Console.WriteLine(); Console.WriteLine(); Console.WriteLine("Decrypted:"); // Reset rotor positions. thinRotor.Position = ToI(thinRotorPosition); slowRotor.Position = ToI(slowRotorPosition); middleRotor.Position = ToI(middleRotorPosition); fastRotor.Position = ToI(fastRotorPosition); // Decrypt. foreach (char c in encrypted) { int input = ToI(c); var output = plugboard.Get(input); var ch = Convert.ToChar('A' + output); Console.Write(ch); Console.Write(' '); } Console.ReadKey(); }