source: trunk/CrypPlugins/PrimesGenerator/PrimesGenerator.cs @ 582

Last change on this file since 582 was 582, checked in by Arno Wacker, 12 years ago
  • Moved Primes Generator and Internet frame generator to generator section (under tools)
  • Note: To do so it was needed to inherit from IRandomNumberGenerator, which is a descended interface from IGenerator. However, IGenerator is not displayed at all in CrypTool 2 - this behavior should be changed.
File size: 5.4 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Cryptool.PluginBase.Generator;
6using System.Reflection;
7using Cryptool.PluginBase;
8using Cryptool.PluginBase.IO;
9using LibGmpWrapper;
10using Cryptool.PluginBase.Tool;
11
12namespace Cryptool.PrimesGenerator
13{
14
15  [PluginInfo(true, "Primes Generator", "Generator for primes numbers", null, "PrimesGenerator/icon.png")]
16  public class PrimesGenerator : IRandomNumberGenerator
17  {
18    private GmpBigInteger m_max = new GmpBigInteger("10000000000");
19    public PrimesGenerator()
20    {
21      m_Settings = new PrimesGeneratorSettings();
22      m_Settings.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(m_Settings_PropertyChanged);
23      m_Mode = 0;
24      m_Input = GmpBigInteger.ValueOf(100);
25    }
26
27
28    #region IPlugin Members
29
30    public event Cryptool.PluginBase.StatusChangedEventHandler OnPluginStatusChanged;
31
32    private void FireOnPluginStatusChangedEvent()
33    {
34      if (OnPluginStatusChanged != null) OnPluginStatusChanged(this, new StatusEventArgs(0));
35    }
36
37    public event Cryptool.PluginBase.GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
38    private void FireOnGuiLogNotificationOccuredEvent(string message, NotificationLevel lvl)
39    {
40      if (OnGuiLogNotificationOccured != null) OnGuiLogNotificationOccured(this, new GuiLogEventArgs(message, this, lvl));
41    }
42    private void FireOnGuiLogNotificationOccuredEventError(string message)
43    {
44      FireOnGuiLogNotificationOccuredEvent(message, NotificationLevel.Error);
45    }
46
47    public event Cryptool.PluginBase.PluginProgressChangedEventHandler OnPluginProgressChanged;
48    private void FireOnPluginProgressChangedEvent(string message, NotificationLevel lvl)
49    {
50      if (OnPluginProgressChanged != null) OnPluginProgressChanged(this, new PluginProgressEventArgs(0, 0));
51    }
52
53
54    private string m_OutputString;
55    [PropertyInfo(Direction.OutputData, "Text output", "A primenumber", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
56    public string OutputString
57    {
58      get { return this.m_OutputString; }
59      set
60      {
61        m_OutputString = value;
62        FirePropertyChangedEvent("OutputString");
63      }
64    }
65    private PrimesGeneratorSettings m_Settings = new PrimesGeneratorSettings();
66    public ISettings Settings
67    {
68      get { return m_Settings; }
69    }
70
71    private GmpBigInteger m_Input;
72    private int m_Mode;
73    private bool hasErrors;
74    void m_Settings_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
75    {
76      hasErrors = false;
77      try
78      {
79        m_Input = new GmpBigInteger(m_Settings.Input);
80        switch (e.PropertyName)
81        {
82          case PrimesGeneratorSettings.MODE:
83          case PrimesGeneratorSettings.INPUT:
84            m_Mode = m_Settings.Mode;
85            switch (m_Mode)
86            {
87              case 0:
88                if (m_Input.CompareTo(GmpBigInteger.One) < 0 || m_Input.CompareTo(GmpBigInteger.ValueOf(400)) > 0)
89                {
90                  FireOnGuiLogNotificationOccuredEventError("Value for n has to be greater or equal than one an less or equal than 400.");
91                  hasErrors = true;
92                }
93                break;
94              case 1:
95                if (m_Input.CompareTo(GmpBigInteger.Ten) < 0 || m_Input.CompareTo(m_max) > 0)
96                {
97                  FireOnGuiLogNotificationOccuredEventError("Please enter an Integer value for n.");
98                  hasErrors = true;
99                }
100                break;
101            }
102            break;
103          default:
104            break;
105        }
106      }
107      catch
108      {
109        FireOnGuiLogNotificationOccuredEventError("Please enter an Integer value for n.");
110        hasErrors = true;
111      }
112    }
113
114    public System.Windows.Controls.UserControl Presentation
115    {
116      get { return null; }
117    }
118
119    public System.Windows.Controls.UserControl QuickWatchPresentation
120    {
121      get { return null; }
122    }
123
124    public void PreExecution()
125    {
126     
127    }
128
129
130    public void Execute()
131    {
132      if (!hasErrors)
133      {
134        switch (m_Mode)
135        {
136          case 0:
137            OutputString = LibGmpWrapper.GmpBigInteger.Random(m_Input).NextProbablePrime().ToString();
138            break;
139          case 1:
140            GmpBigInteger result = LibGmpWrapper.GmpBigInteger.RandomM(m_Input).NextProbablePrime();
141            while (result.CompareTo(m_Input) > 0)
142            {
143              result = LibGmpWrapper.GmpBigInteger.RandomM(m_Input).NextProbablePrime();
144            }
145            OutputString = result.ToString();
146            break;
147        }
148      }
149    }
150
151    public void PostExecution()
152    {
153     
154    }
155
156    public void Pause()
157    {
158     
159    }
160
161    public void Stop()
162    {
163     
164    }
165
166    public void Initialize()
167    {
168
169     
170    }
171
172    public void Dispose()
173    {
174     
175    }
176
177    #endregion
178
179    #region INotifyPropertyChanged Members
180
181    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
182
183    private void FirePropertyChangedEvent(string propertyName)
184    {
185      if (PropertyChanged != null) PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
186    }
187    #endregion
188  }
189}
Note: See TracBrowser for help on using the repository browser.