source: trunk/CrypPlugins/PeerToPeerBaseProxy/P2PPeerSettings.cs @ 1434

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

+ Added early version of Peer2PeerBaseProxy, which uses CrypP2P instead of new P2P connections for each plugin instance in a workspace (compatible, but not yet functional)

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