source: trunk/CrypPlugins/BigNumber/BigNumberOperation.cs @ 973

Last change on this file since 973 was 973, checked in by kopal, 12 years ago
  • icons of BigNumberOperators now are set correctly after loading
  • "BooleanInput and BoolButton" -> merged functions into BooleanInput and deleted BoolButton (only need one BooleanInput)
  • BooleanFunctions now have a new setting (set if an update needs both inputs changed or not)
File size: 9.0 KB
Line 
1/*                             
2   Copyright 2009 Team CrypTool (Sven Rech,Dennis Nolte,Raoul Falk,Nils Kopal), Uni Duisburg-Essen
3
4   Licensed under the Apache License, Version 2.0 (the "License");
5   you may not use this file except in compliance with the License.
6   You may obtain a copy of the License at
7
8       http://www.apache.org/licenses/LICENSE-2.0
9
10   Unless required by applicable law or agreed to in writing, software
11   distributed under the License is distributed on an "AS IS" BASIS,
12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   See the License for the specific language governing permissions and
14   limitations under the License.
15*/
16
17using System;
18using Cryptool.PluginBase.IO;
19using Cryptool.PluginBase;
20using Cryptool.PluginBase.Miscellaneous;
21using System.ComponentModel;
22
23namespace Cryptool.Plugins.BigNumber
24{
25    [Author("Sven Rech", "sven.rech@cryptool.org", "Uni Duisburg-Essen", "http://www.uni-due.de")]
26    [PluginInfo(false, "BigNumberOperation", "Big Number Operation", "BigNumber/DetailedDescription/DescriptionOperation.xaml", "BigNumber/icons/plusIcon.png", "BigNumber/icons/minusIcon.png", "BigNumber/icons/timesIcon.png", "BigNumber/icons/divIcon.png", "BigNumber/icons/powIcon.png", "BigNumber/icons/gcdicon.png")]
27    class BigNumberOperation : IThroughput
28    {
29
30        #region private variable
31        //The variables are defined
32        private BigInteger input1 = null; 
33        private BigInteger input2 = null;
34        private BigInteger mod = null;
35        private BigInteger output = null;
36        private BigNumberOperationSettings settings = new BigNumberOperationSettings();
37
38        #endregion
39
40        #region event
41
42        public event Cryptool.PluginBase.StatusChangedEventHandler OnPluginStatusChanged;
43
44        public event Cryptool.PluginBase.GuiLogNotificationEventHandler OnGuiLogNotificationOccured;     
45
46        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
47
48        public event Cryptool.PluginBase.PluginProgressChangedEventHandler OnPluginProgressChanged;
49
50        #endregion
51
52        #region public
53
54        public BigNumberOperation()
55        {
56            this.settings.OnPluginStatusChanged += settings_OnPluginStatusChanged;
57        }
58
59        /// <summary>
60        /// The inputs are defined.
61        /// Only BigInteger are accepted.
62        /// </summary>
63        [PropertyInfo(Direction.InputData, "x Input", "Number input 1", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.None, null)]
64        public BigInteger Input1
65        {
66            get
67            {
68                return input1;
69            }
70            set
71            {
72                input1 = value;
73                OnPropertyChanged("Input1");
74            }
75        }
76
77       
78        [PropertyInfo(Direction.InputData, "y Input", "Number input 2", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.None, null)]
79        public BigInteger Input2
80        {
81            get
82            {
83                return input2;
84            }
85            set
86            {
87                input2 = value;
88                OnPropertyChanged("Input2");
89            }
90        }
91
92       
93        [PropertyInfo(Direction.InputData, "Modulo", "Modulo input", "", DisplayLevel.Beginner)]
94        public BigInteger Mod
95        {
96            get
97            {
98                return mod;
99            }
100            set
101            {
102                mod = value;
103                OnPropertyChanged("Mod");
104            }
105        }
106
107        /// <summary>
108        /// The output is defined.
109        /// </summary>
110        [PropertyInfo(Direction.OutputData, "Output", "Number output", "", DisplayLevel.Beginner)]
111        public BigInteger Output
112        {
113            get
114            {
115                return output;
116            }
117            set
118            {
119                output = value;
120                OnPropertyChanged("Output");
121             }
122        }
123
124       
125        /// <summary>
126        /// Showing the progress change while plug-in is working
127        /// </summary>
128        /// <param name="value">Value of current process progress</param>
129        /// <param name="max">Max value for the current progress</param>
130        private void ProgressChanged(double value, double max)
131        {
132            EventsHelper.ProgressChanged(OnPluginProgressChanged, this, new PluginProgressEventArgs(value, max));
133        }
134
135       
136        public ISettings Settings
137        {
138            get { return settings; }
139            set { settings = (BigNumberOperationSettings)value; }
140        }
141
142
143        public System.Windows.Controls.UserControl Presentation
144        {
145            get { return null; }
146        }
147
148        public System.Windows.Controls.UserControl QuickWatchPresentation
149        {
150            get { return null; }
151        }
152
153        public void PreExecution()
154        {
155            input1 = null;
156            input2 = null;
157            mod = null;
158        }
159
160        /// <summary>
161        /// Main method
162        /// </summary>
163        public void Execute()
164        {
165            //First checks if both inputs are set
166            if (input1 != null && input2 != null)
167            {
168                ProgressChanged(0.5, 1.0);
169                try
170                {
171                    //As the user changes the operation different outputs are calculated.
172                    switch (settings.Operat)
173                    {
174                        // x + y
175                        case 0:
176                            if (Mod is object)
177                                Output = (Input1 + Input2) % Mod;
178                            else
179                                Output = Input1 + Input2;
180                            break;
181                        // x - y
182                        case 1:
183                            if (Mod is object)
184                                Output = (Input1 - Input2) % Mod;
185                            else
186                                Output = Input1 - Input2;
187                            break;
188                        //x * y
189                        case 2:
190                            if (Mod is object)
191                                Output = (Input1 * Input2) % Mod;
192                            else
193                                Output = Input1 * Input2;
194                            break;
195                        // x / y
196                        case 3:
197                            if (Mod is object)
198                                Output = (Input1 / Input2) % Mod;
199                            else
200                                Output = Input1 / Input2;
201                            break;
202                        // x ^ y
203                        case 4:
204                            if (Mod is object)
205                            {
206                                if (Input2 >= 0)
207                                    Output = Input1.modPow(Input2, Mod);
208                                else
209                                {
210                                    Output = Input1.modInverse(Mod).modPow(-Input2, Mod);
211                                }
212                            }
213                            else
214                            {
215                                Output = Input1.pow(Input2);
216                            }
217                            break;
218                        // gcd(x,y)
219                        case 5:
220                                Output = Input1.gcd(Input2);
221                            break;
222                    }
223                }
224                catch (Exception e)
225                {
226                    GuiLogMessage("Big Number fail: " + e.Message, NotificationLevel.Error);
227                    return;
228                }
229                ProgressChanged(1.0, 1.0);
230            }
231        }
232
233        public void PostExecution()
234        {
235        }
236
237        public void Pause()
238        {
239        }
240
241        public void Stop()
242        {
243        }
244
245        public void Initialize()
246        {           
247            //change to the correct icon which belongs to actual selected arithmetic function
248            ((BigNumberOperationSettings)this.settings).changeToCorrectIcon(((BigNumberOperationSettings)this.settings).Operat);
249        }
250
251        public void Dispose()
252        {
253        }
254
255        #endregion
256
257        #region private       
258
259        private void OnPropertyChanged(string p)
260        {
261            EventsHelper.PropertyChanged(PropertyChanged, this, new PropertyChangedEventArgs(p));
262        }
263
264        private void GuiLogMessage(string p, NotificationLevel notificationLevel)
265        {
266            EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(p, this, notificationLevel));
267        }
268
269        private void settings_OnPluginStatusChanged(IPlugin sender, StatusEventArgs args)
270        {
271            if (OnPluginStatusChanged != null) OnPluginStatusChanged(this, args);
272        }
273
274        #endregion
275    }
276}
Note: See TracBrowser for help on using the repository browser.