/// <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; } } }
/// <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(); } } }