source: trunk/CrypPlugins/PeerToPeerBase/P2PPeerSettings.cs @ 1696

Last change on this file since 1696 was 1696, checked in by Paul Lelgemann, 12 years ago

o Simplified peer-to-peer settings: overlay and DHT type are now selected by architecture

File size: 9.9 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Cryptool.PluginBase;
6using System.ComponentModel;
7using Cryptool.PluginBase.Control;
8using System.Windows;
9using Cryptool.Plugins.PeerToPeer.Internal;
10
11namespace Cryptool.Plugins.PeerToPeer
12{
13    class P2PPeerSettings : ISettings
14    {
15        public event TaskPaneAttributeChangedHandler TaskPaneAttributeChanged;
16        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
17
18        private bool hasChanges = false;
19        private P2PPeer p2pPeer;
20
21        #region ISettings Members
22
23        public bool HasChanges
24        {
25            get
26            {
27                return hasChanges;
28            }
29            set
30            {
31                hasChanges = value;
32            }
33        }
34
35        #endregion
36
37        #region taskPane
38
39        public P2PPeerSettings (P2PPeer p2pPeer)
40            {
41            if(TaskPaneAttributeChanged != null)
42                TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("BtnStop", Visibility.Hidden)));
43            this.p2pPeer = p2pPeer;
44            ChangePluginIcon(PeerStatus.NotConnected);
45            }
46
47        #endregion
48
49        #region Start- and Stop-Buttons incl. functionality
50
51        /** ATTENTION: Change property changeableWhileExecuting to false for the Start and Stop Button.
52         * Only set to true for testing issues.*/
53
54        //[TaskPane("Start", "Initializes and starts Peer", null, 2, false, DisplayLevel.Beginner, ControlType.Button)]
55        [TaskPane("Start", "Connects to the P2P-system.", null, 2, true, DisplayLevel.Beginner, ControlType.Button)]
56        public void BtnStart()
57        {
58            if (P2PWorldName != null)
59            {
60                this.p2pPeer.StartPeer();
61            }
62            else
63            {
64                PeerStatusChanged(PeerStatus.Error);
65                // can not initialize Peer, because P2PUserName and/or P2PWorldName are missing
66                throw (new Exception("You must set the P2P username and worldname, otherwise starting the peer isn't possible"));
67            }
68        }
69
70        //[TaskPane("Stop", "Stops the Peer", null, 3, false, DisplayLevel.Beginner, ControlType.Button)]
71        [TaskPane("Stop", "Disconnects from the P2P-system", null, 3, true, DisplayLevel.Beginner, ControlType.Button)]
72        public void BtnStop()
73        {
74            this.p2pPeer.StopPeer();
75         
76            OnPropertyChanged("PeerStopped");
77        }
78
79        [TaskPane("Internal state dump", "Dumps the interla state of the P2P system to syslog.", "P2P Expert Settings", 0, true, DisplayLevel.Beginner, ControlType.Button)]
80        public void BtnLogInternalState()
81        {
82            this.p2pPeer.LogInternalState();
83        }
84
85        #endregion
86
87        #region Setting-Fields
88
89        private string p2pPeerName = PAPCertificate.CERTIFIED_PEER_NAME;
90        [TaskPane("P2P Username", "Your username for the peers@play-system. Note that you need to have a corresponding certificate installed on your computer. If you don't know what this means, just leave the default \"CrypTool2\"-username and everything will be taken care of.", null, 0, false, DisplayLevel.Beginner, ControlType.TextBox)]
91        public string P2PPeerName
92        {
93            get { return this.p2pPeerName; }
94            set
95            {
96                if (value != this.p2pPeerName)
97                {
98                    this.p2pPeerName = value;
99                    OnPropertyChanged("P2PPeerName");
100                    HasChanges = true;
101                }
102            }
103        }
104
105        private string p2pWorldName;
106        [TaskPane("P2P World", "P2P Name of the world.", null, 1, false, DisplayLevel.Beginner, ControlType.TextBox)]
107        public string P2PWorldName
108        {
109            get { return this.p2pWorldName; }
110            set
111            {
112                if (value != this.p2pWorldName)
113                {
114                    this.p2pWorldName = value;
115                    OnPropertyChanged("P2PWorldName");
116                    HasChanges = true;
117                }
118            }
119        }
120
121        //private bool p2pUseNatTraversal = false;
122        //[TaskPane("Use NAT Traversal", "Activate/Deactivate NAT-Traversal (tunneling connections through NATs " +
123        //    "and Firewalls, necessary to work in different networks in the same world)", "P2P Expert Settings", 0, false,
124        //    DisplayLevel.Beginner, ControlType.CheckBox)]
125        //public bool P2PUseNatTraversal
126        //{
127        //    get { return this.p2pUseNatTraversal; }
128        //    set
129        //    {
130        //        if (value != this.p2pUseNatTraversal)
131        //        {
132        //            this.p2pUseNatTraversal = value;
133        //            OnPropertyChanged("P2PUseNatTraversal");
134        //            HasChanges = true;
135        //        }
136        //    }
137        //}
138
139        private bool log2Monitor = true;
140        [TaskPane("Use syslogging", "Logs all p2p actions to the to a sylog-daemon on localhost.", "P2P Expert Settings", 1, false,
141            DisplayLevel.Beginner, ControlType.CheckBox)]
142        public bool Log2Monitor
143        {
144            get { return this.log2Monitor; }
145            set
146            {
147                if (value != this.log2Monitor)
148                {
149                    this.log2Monitor = value;
150                    OnPropertyChanged("Log2Monitor");
151                    HasChanges = true;
152                }
153            }
154        }
155
156        private P2PLinkManagerType p2pLinkManagerType = P2PLinkManagerType.Snal;
157        [TaskPane("LinkManager-Type", "Select the LinkManager-Type", "P2P Expert Settings", 2, false, DisplayLevel.Beginner, ControlType.ComboBox, new string[] { "Snal" })]
158        public int P2PLinkMngrType
159        {
160            get { return (int)this.p2pLinkManagerType; }
161            set
162            {
163                if ((P2PLinkManagerType)value != this.p2pLinkManagerType)
164                {
165                    this.p2pLinkManagerType = (P2PLinkManagerType)value;
166                    OnPropertyChanged("P2PLinkManagerType");
167                    HasChanges = true;
168                }
169            }
170        }
171
172        private P2PBootstrapperType p2pBSType = P2PBootstrapperType.LocalMachineBootstrapper;
173        [TaskPane("Bootstrapper-Type", "Select the Bootstrapper-Type", "P2P Expert Settings", 3, false, DisplayLevel.Beginner, ControlType.ComboBox, new string[] { "LocalMachineBootstrapper", "IrcBootstrapper" })]
174        public int P2PBSType
175        {
176            get { return (int)this.p2pBSType; }
177            set
178            {
179                if ((P2PBootstrapperType)value != this.p2pBSType)
180                {
181                    this.p2pBSType = (P2PBootstrapperType)value;
182                    OnPropertyChanged("P2PBSType");
183                    HasChanges = true;
184                }
185            }
186        }
187
188        private P2PArchitecture p2pArchitecture = Internal.P2PArchitecture.FullMesh;
189        [TaskPane("Architecture", "Select the Architecture", "P2P Expert Settings", 4, false, DisplayLevel.Beginner, ControlType.ComboBox, new string[] { "FullMesh" })]
190        public int P2PArchitecture
191        {
192            get { return (int)this.p2pArchitecture; }
193            set
194            {
195                if ((P2PArchitecture)value != this.p2pArchitecture)
196                {
197                    this.p2pArchitecture = (P2PArchitecture)value;
198                    OnPropertyChanged("P2PArchitecture");
199                    HasChanges = true;
200                }
201            }
202        }
203        #endregion
204
205        #region INotifyPropertyChanged Members
206
207        private void OnPropertyChanged(string p)
208        {
209            if (PropertyChanged != null)
210            {
211                PropertyChanged(this, new PropertyChangedEventArgs(p));
212            }
213        }
214
215        #endregion
216
217        // Index depends on icon-position in P2PPeer-Class properties
218        public enum PeerStatus
219        {
220            NotConnected = 0,
221            Connecting = 1,
222            Online = 2,
223            Error = 3
224        }
225
226        /// <summary>
227        /// Changes icon of P2PPeer and visibility of the control buttons in settings
228        /// </summary>
229        /// <param name="peerStat"></param>
230        public void PeerStatusChanged(PeerStatus peerStat)
231        {
232            ChangePluginIcon(peerStat);
233            // Only set visibility in final states!
234            switch (peerStat)
235            {
236                case PeerStatus.Online:
237                    TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(
238                        new TaskPaneAttribteContainer("BtnStart", Visibility.Collapsed)));
239                    TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(
240                        new TaskPaneAttribteContainer("BtnStop", Visibility.Visible)));
241                    break;
242                case PeerStatus.NotConnected:
243                    TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(
244                        new TaskPaneAttribteContainer("BtnStart", Visibility.Visible)));
245                    TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(
246                        new TaskPaneAttribteContainer("BtnStop", Visibility.Hidden)));
247                    break;
248                case PeerStatus.Error:
249                case PeerStatus.Connecting:
250                default:
251                    break;
252            }
253        }
254
255        public event StatusChangedEventHandler OnPluginStatusChanged;
256        private void ChangePluginIcon(PeerStatus peerStatus)
257        {
258            if (OnPluginStatusChanged != null) 
259                OnPluginStatusChanged(null, new StatusEventArgs(StatusChangedMode.ImageUpdate, (int)peerStatus));
260        }
261    }
262}
Note: See TracBrowser for help on using the repository browser.