示例#1
0
        /* Funzione che tenta di instaurare la connessione. Riavvia l'interfaccia di connessione se la connessione fallisce.
         * In caso di connessione riuscita, crea la Window principale (MainWindow) se non già esistente
         * Se già esistente invece, perchè già si è collegati ad un altro server, crea un nuovo tab
         */
        private void ConnectionRequest(IAsyncResult result)
        {
            ClientProperties properties = result.AsyncState as ClientProperties;

            // Nel caso in cui la connessione fallisce

            if ((properties == null) || (!properties.client.Connected))
            {
                MessageBox.Show("Connessione fallita");

                this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() =>
                {
                    // Abilitazione dei vari componenti dell'interfaccia
                    ConnectButton.IsEnabled  = true;
                    txtAddress1.IsEnabled    = true;
                    txtPort.IsEnabled        = true;
                    IPaddressesBox.IsEnabled = true;
                    this.Cursor = Cursors.Arrow;
                }));

                return;
            }

            NetworkStream stream = properties.client.GetStream();

            // Imposto il tempo in cui il client si mette in attesa di ricevere dati
            stream.ReadTimeout = 5000;

            // Se la connessione ha avuto successo, bisogna verificare se esiste già una MainWindow
            //  - Se esiste, significa che non bisogna crearne una nuova, ma bisogna solo aggiungere un tab
            //  - Se non esiste, significa che bisogna crearne una nuova


            //il dispatcher è un oggetto associato alla UIThread ed è condiviso tra più thread.
            //un thread secondario non può aggiornare la grafica percui deve inserire nel dispatcher
            //un metodo per farlo. Questo metodo inserito nel dispatcher verrà eseguito dallo UIthread.

            //BeginInvoke fa eseguire tale metodo in maniera asincrona a differenza di invoke che è bloccante.

            this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() =>
            {
                // Caso in cui MainWindow esiste già
                foreach (Window window in System.Windows.Application.Current.Windows)
                {
                    if (window is MainWindow)
                    {
                        MainWindow w = window as MainWindow;
                        w.NewTab(properties.client, stream, properties.address);
                        w.ActiveConnectionsIPList.Add(properties.address);
                        this.Close();
                        return;
                    }
                }

                // Caso in cui MainWindows non esiste: creazione di una nuova MainWindow
                MainWindow main = new MainWindow(properties.client, stream, properties.address);
                main.ActiveConnectionsIPList.Add(properties.address);
                this.Close();
                main.Show();
            }));

            try
            {
                properties.client.EndConnect(result);
            }
            catch (SocketException)
            {
                // In caso di errore sul socket: chiusura del nuovo tab
                ExceptionHandler.ConnectionError();
            }
            catch (ObjectDisposedException)
            {
                // In caso di chiusura del socket: chiusura del tab
                ExceptionHandler.ConnectionError();
            }
        }
示例#2
0
        /// <summary>
        /// Funzione che tenta di instaurare la connessione. Riavvia l'interfaccia di connessione se la connessione fallisce.
        /// In caso di connessione riuscita, crea la Window principale (MainWindow) se non già esistente
        /// Se già esistente invece, perchè già si è collegati ad un altro server, crea un nuovo tab
        /// </summary>
        /// <param name="result"> Struttura contenente il risultato delle operazioni asincrone </param>
        private void ConnectionRequest(IAsyncResult result)
        {
            ClientProperties properties = result.AsyncState as ClientProperties;

            // Nel caso in cui la connessione fallisce

            if ((properties == null) || (!properties.client.Connected))
            {
                MessageBox.Show("Impossibile stabilire una connessione");

                this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() =>
                {
                    // Abilitazione dei vari componenti dell'interfaccia
                    ConnectButton.IsEnabled = true;
                    txtAddress1.IsEnabled   = txtAddress2.IsEnabled = txtAddress3.IsEnabled = txtAddress4.IsEnabled = true;
                    txtPort.IsEnabled       = true;
                    this.Cursor             = Cursors.Arrow;
                }));

                return;
            }

            NetworkStream stream = properties.client.GetStream();

            // Imposto il tempo in cui il client si mette in attesa di ricevere dati
            stream.ReadTimeout = 5000;

            // Se la connessione ha avuto successo, bisogna verificare se esiste già una MainWindow
            //  - Se esiste, significa che non bisogna crearne una nuova, ma bisogna solo aggiungere un tab
            //  - Se non esiste, significa che bisogna crearne una nuova

            this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() =>
            {
                // Caso in cui MainWindow esiste già
                foreach (Window window in System.Windows.Application.Current.Windows)
                {
                    if (window is MainWindow)
                    {
                        MainWindow w = window as MainWindow;
                        w.NewTab(properties.client, stream, properties.address);
                        w.ActiveConnections.Add(properties.address);
                        this.Close();
                        return;
                    }
                }

                // Caso in cui MainWindows non esiste: creazione di una nuova MainWindow
                MainWindow main = new MainWindow(properties.client, stream, properties.address);
                main.ActiveConnections.Add(properties.address);
                this.Close();
                main.Show();
            }));

            try
            {
                properties.client.EndConnect(result);
            }
            catch (SocketException)
            {
                // In caso di errore sul socket: chiusura del nuovo tab
                ExceptionHandler.ConnectionError();
            }
            catch (ObjectDisposedException)
            {
                // In caso di chiusura del socket: chiusura del tab
                ExceptionHandler.ConnectionError();
            }
        }