예제 #1
0
        /// <summary>
        /// Callback Method that should be callled when Synchronization (Communication) error occurs.
        /// </summary>
        /// <param name="type">Type of error that occurs.</param>
        internal void ErrorCallBack(Synchronization.ErrorType type)
        {
            Console.WriteLine("Calling");
            if (InvokeRequired)
            {
                Invoke((MethodInvoker) delegate { ErrorCallBack(type); });
                return;
            }
            else
            {
                switch (type)
                {
                case Synchronization.ErrorType.AllreadyBindTCPPort:
                    synch.StopSynchronizing();
                    Close();
                    break;

                case Synchronization.ErrorType.ConnectionProblem:
                    MessageBox.Show("Nebylo možno navázat spojení, ujistěte se zda je druhá instance stále zapnuta a viditelná.");
                    synch.StopSynchronizing();
                    Close();
                    break;

                case Synchronization.ErrorType.ConnectionLost:
                    MessageBox.Show("Došlo ke ztrátě spojení.");
                    synch.StopSynchronizing();
                    Close();
                    break;
                }
            }
        }
예제 #2
0
        /// <summary>
        /// Receiving changes and response. It should be called in separate Thread.
        /// </summary>
        /// <param name="sinceObject">Date after which changes are received.</param>
        private void receivingParallel(object sinceObject)
        {
            DateTime since = (DateTime)sinceObject;

            lock (stateChangeLock)
            {
                listener       = null;
                receiverStream = null;
                receiver       = null;
            }
            try
            {
                listener = new TcpListener(IPAddress.Any, Constants.TCPPort);
                listener.Start();

                if (!waitUntillConnectionOrEnd(listener))
                {
                    return;
                }

                receiver = listener.AcceptTcpClient();

                receiverStream = receiver.GetStream();

                using (StreamReader cReader = new StreamReader(receiverStream))
                    using (StreamWriter cWriter = new StreamWriter(receiverStream))
                    {
                        cWriter.WriteLine("SendMeYourChanges;" + since.ToString(Constants.DateTimeFormat) + ";" + synch.InstanceID + ";?");
                        if (stopRequested)
                        {
                            return;
                        }
                        cWriter.Flush();

                        string remoteResponse = cReader.ReadLine();
                        if (remoteResponse == "TerminateConnection;?")
                        {
                            synch.CallbackError(Synchronization.ErrorType.ConnectionLost);
                            return;
                        }

                        if (!tryReceiveMaxCountChanges(cReader))
                        {
                            return;
                        }

                        if (!receiveAllChanges(cReader))
                        {
                            return;
                        }

                        synch.RemoteChangeFull = true;

                        lock (sendNewChangesRequest)
                        { if (!bypassWaiting)
                          {
                              Monitor.Wait(sendNewChangesRequest);
                          }
                        }

                        if (!decideAndExecuteNewChanges(cReader, cWriter))
                        {
                            return;
                        }

                        cWriter.WriteLine("EndOfConnection;?");
                        if (stopRequested)
                        {
                            return;
                        }
                        cWriter.Flush();

                        if (!waitUntillConnectionEnd(cReader))
                        {
                            return;
                        }

                        synch.StopSynchronizing();
                    }
            }
            catch (SocketException)
            {
                //Closed Connection due to closing of synch Form
                synch.CallbackError(Synchronization.ErrorType.ConnectionLost);
            }
            catch (IOException)
            {
                //Closed Streame due to closing of synch Form
                synch.CallbackError(Synchronization.ErrorType.ConnectionLost);
            }
            catch (ObjectDisposedException)
            {
                //Closed object due to closing of synch Form
                synch.CallbackError(Synchronization.ErrorType.ConnectionLost);
            }
            catch (InvalidOperationException)
            {
                //Closed object due to closing of synch Form
                synch.CallbackError(Synchronization.ErrorType.ConnectionLost);
            }
            finally
            {
                lock (stateChangeLock)
                {
                    if (receiver != null)
                    {
                        if (!closed)
                        {
                            closed = true;
                            if (receiver.Connected && receiver.GetStream() != null)
                            {
                                receiver.GetStream().Close();
                            }

                            receiver.Close();
                        }
                    }
                    receiver       = null;
                    receiverStream = null;
                }
                if (listener != null)
                {
                    listener.Stop();
                }
            }
        }