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

Last change on this file since 2081 was 2081, checked in by Sven Rech, 11 years ago

CrypP2P tries to reconnect now when SystemLeft event occurs

File size: 5.5 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 Cryptool.P2P.Worker;
20using Cryptool.PluginBase;
21
22namespace Cryptool.P2P.Internal
23{
24    public class ConnectionManager
25    {
26        #region Delegates
27
28        public delegate void P2PConnectionStateChangeEventHandler(object sender, bool newState);
29
30        #endregion
31
32        private readonly object connectLock = new object();
33        private readonly P2PBase p2PBase;
34        private DateTime lastConnectionAttempt;
35
36        public ConnectionManager(P2PBase p2PBase)
37        {
38            this.p2PBase = p2PBase;
39
40            bool reconnecting = false;
41            p2PBase.OnSystemLeft += new P2PBase.SystemLeft(delegate
42                                                               {
43                                                                   //Enforce a minimum of 2 seconds between each connection attempt:
44                                                                   if ((lastConnectionAttempt - DateTime.Now).TotalSeconds < 2)
45                                                                       Thread.Sleep(2000);
46
47                                                                   P2PManager.GuiLogMessage("Lost P2P Connection. Try reconnecting...",
48                                                                        NotificationLevel.Error);
49                                                                   reconnecting = true;
50                                                                   this.Connect();
51                                                               });
52            p2PBase.OnSystemJoined += new P2PBase.SystemJoined(delegate
53                                                                   {
54                                                                       if (p2PBase.IsConnected && reconnecting)
55                                                                       {
56                                                                           P2PManager.GuiLogMessage("Successfully reconnected!",
57                                                                                NotificationLevel.Balloon);
58                                                                           reconnecting = false;
59                                                                       }
60                                                                   });
61        }
62
63        public bool IsConnecting { get; internal set; }
64        public event P2PConnectionStateChangeEventHandler OnP2PConnectionStateChangeOccurred;
65
66        public void Connect()
67        {
68            lock (connectLock)
69            {
70                lastConnectionAttempt = DateTime.Now;
71
72                if (p2PBase.IsConnected || IsConnecting)
73                {
74                    P2PManager.GuiLogMessage("Cannot connect, already connected or connecting.",
75                                             NotificationLevel.Warning);
76                    return;
77                }
78
79                if (!IsReadyToConnect())
80                {
81                    P2PManager.GuiLogMessage("Cannot connect, configuration is broken.", NotificationLevel.Warning);
82                    return;
83                }
84
85                IsConnecting = true;
86            }
87
88            P2PManager.GuiLogMessage("Dispatching connect request with ConnectionWorker.", NotificationLevel.Debug);
89            new ConnectionWorker(p2PBase, this).Start();
90        }
91
92        public void Disconnect()
93        {
94            lock (connectLock)
95            {
96                if (!p2PBase.IsConnected || IsConnecting)
97                {
98                    P2PManager.GuiLogMessage("Cannot disconnect, no connection or connection attempt active.",
99                                             NotificationLevel.Warning);
100                    return;
101                }
102
103                IsConnecting = true;
104            }
105
106            P2PManager.GuiLogMessage("Dispatching disconnect request with ConnectionWorker.", NotificationLevel.Debug);
107            new ConnectionWorker(p2PBase, this).Start();
108        }
109
110        public bool IsReadyToConnect()
111        {
112            if (String.IsNullOrEmpty(P2PSettings.Default.PeerName))
113            {
114                P2PManager.GuiLogMessage("Peer-to-peer not fully configured: username missing.", NotificationLevel.Error);
115                return false;
116            }
117
118            if (String.IsNullOrEmpty(P2PSettings.Default.PeerName))
119            {
120                P2PManager.GuiLogMessage("Peer-to-peer not fully configured: world name missing.",
121                                         NotificationLevel.Error);
122                return false;
123            }
124
125            return true;
126        }
127
128        public void FireConnectionStatusChange()
129        {
130            if (OnP2PConnectionStateChangeOccurred != null)
131            {
132                OnP2PConnectionStateChangeOccurred(this, p2PBase.IsConnected);
133            }
134        }
135    }
136}
Note: See TracBrowser for help on using the repository browser.