source: trunk/CrypP2P/Internal/ConnectionManager.cs @ 2358

Last change on this file since 2358 was 2358, checked in by kopal, 11 years ago
  • multiple connections to the p2p network are now avoided
  • some design changes
File size: 7.6 KB
Line 
1/*
2   Copyright 2010 Paul Lelgemann, University of 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 System.Threading;
19using System.Windows.Threading;
20using Cryptool.P2P.Worker;
21using Cryptool.PluginBase;
22using PeersAtPlay.CertificateLibrary.Certificates;
23using System.IO;
24
25namespace Cryptool.P2P.Internal
26{
27    public class ConnectionManager
28    {
29        #region Delegates
30
31        public delegate void P2PConnectionStateChangeEventHandler(object sender, bool newState);
32        public delegate void P2PTryConnectingStateChangeEventHandler(object sender, bool newState);
33
34        #endregion
35
36        #region Events
37
38        public event P2PConnectionStateChangeEventHandler OnP2PConnectionStateChangeOccurred;
39        public event P2PTryConnectingStateChangeEventHandler OnP2PTryConnectingStateChangeOccurred;
40
41        #endregion
42
43        private readonly object connectLock = new object();
44        private readonly P2PBase p2PBase;
45        private DateTime lastConnectionAttempt;
46        private Dispatcher guiLogDispatcher = null;
47        private bool disconnected = false;
48
49        public ConnectionManager(P2PBase p2PBase)
50        {
51            this.p2PBase = p2PBase;
52
53            bool reconnecting = false;
54            p2PBase.OnSystemLeft += new P2PBase.SystemLeft(delegate
55                                                               {
56                                                                   if (disconnected)
57                                                                       return;
58
59                                                                   //Enforce a minimum of 2 seconds between each connection attempt:
60                                                                   if ((lastConnectionAttempt - DateTime.Now).TotalSeconds < 2)
61                                                                       Thread.Sleep(2000);
62
63                                                                   P2PManager.GuiLogMessage("Lost P2P Connection. Try reconnecting...",
64                                                                        NotificationLevel.Error);
65                                                                   reconnecting = true;
66                                                                   this.Connect();
67                                                                   guiLogDispatcher = Dispatcher.CurrentDispatcher;
68                                                               });
69            p2PBase.OnSystemJoined += new P2PBase.SystemJoined(delegate
70                                                                   {
71                                                                       if (p2PBase.IsConnected && reconnecting)
72                                                                       {
73                                                                           //TODO: This doesn't work. GuiLogMessage will never be shown:
74                                                                           if (guiLogDispatcher != null)
75                                                                                guiLogDispatcher.Invoke(DispatcherPriority.Send, (SendOrPostCallback)delegate
76                                                                                {
77                                                                                    P2PManager.GuiLogMessage("Successfully reconnected!",
78                                                                                        NotificationLevel.Balloon);
79                                                                                }, null);
80                                                                           reconnecting = false;
81                                                                       }
82                                                                   });
83        }
84
85        private bool isConnecting;
86        public bool IsConnecting { 
87            get { return isConnecting; } 
88            internal set
89            {
90                isConnecting = value;
91                if (OnP2PTryConnectingStateChangeOccurred != null)
92                {
93                    OnP2PTryConnectingStateChangeOccurred(this, isConnecting);
94                }
95            }
96        }
97       
98        public void Connect()
99        {
100            lock (connectLock)
101            {
102                disconnected = false;
103                lastConnectionAttempt = DateTime.Now;
104               
105                if (p2PBase.IsConnected || IsConnecting)
106                {
107                    P2PManager.GuiLogMessage("Cannot connect, already connected or connecting.",
108                                             NotificationLevel.Warning);
109                    return;
110                }
111
112                if (!IsReadyToConnect())
113                {
114                    P2PManager.GuiLogMessage("Cannot connect, configuration is broken.", NotificationLevel.Warning);
115                    return;
116                }
117
118                IsConnecting = true;
119            }
120
121            P2PManager.GuiLogMessage("Dispatching connect request with ConnectionWorker.", NotificationLevel.Debug);
122            new ConnectionWorker(p2PBase, this).Start();
123        }
124
125        public void Disconnect()
126        {
127            lock (connectLock)
128            {
129                disconnected = true;
130                if (!p2PBase.IsConnected || IsConnecting)
131                {
132                    P2PManager.GuiLogMessage("Cannot disconnect, no connection or connection attempt active.",
133                                             NotificationLevel.Warning);
134                    return;
135                }
136
137                IsConnecting = true;
138            }
139
140            P2PManager.GuiLogMessage("Dispatching disconnect request with ConnectionWorker.", NotificationLevel.Debug);
141            new ConnectionWorker(p2PBase, this).Start();
142        }
143
144        public bool IsReadyToConnect()
145        {
146            if (String.IsNullOrEmpty(P2PSettings.Default.PeerName))
147            {
148                P2PManager.GuiLogMessage("Peer-to-peer not fully configured: username missing.", NotificationLevel.Error);
149                return false;
150            }
151
152            if (String.IsNullOrEmpty(P2PSettings.Default.Password))
153            {
154                P2PManager.GuiLogMessage("Peer-to-peer not fully configured: password missing.",
155                                         NotificationLevel.Error);
156                return false;
157            }
158
159            if (String.IsNullOrEmpty(P2PSettings.Default.WorldName))
160            {
161                P2PManager.GuiLogMessage("Peer-to-peer not fully configured: world name missing.",
162                                         NotificationLevel.Error);
163                return false;
164            }
165
166            return true;
167        }
168
169        public void FireConnectionStatusChange()
170        {
171            if (OnP2PConnectionStateChangeOccurred != null)
172            {
173                OnP2PConnectionStateChangeOccurred(this, p2PBase.IsConnected);
174            }
175        }
176    }
177}
Note: See TracBrowser for help on using the repository browser.