protected virtual void SetResult(FileWatcherFile result) { if (result.Error != FileWatcherError.Success) { base.SetResult(new[] { result }); return; } _lock.EnterWriteLock(); var endPoint = result.EndPoint; foreach (var path in result.Paths) _signals[new Tuple<string, string>(endPoint, path)] = 0; _lock.ExitWriteLock(); }
private IEnumerator<int> ProcessRequest(FileWatcherFile file, AsyncEnumerator ae) { //var destination = ""; // (!Path.IsPathRooted(Destination) ? Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Destination) : Destination); var sender = file.EndPoint; try { var messages = new List<Message>(); try { foreach (var path in file.Paths) { byte[] buffer; try { buffer = File.ReadAllBytes(path); } catch (Exception e) { _logger.Warn("Unable to read length data from " + sender, e); yield break; } var queue = Path.GetDirectoryName(path).Substring(sender.Length); messages.Add(SerializationExtensions.ToMessage(buffer, queue, Path.GetFileName(path), File.GetCreationTime(path))); File.Delete(path); } _logger.DebugFormat("Deserialized {0} messages from {1}", messages.Count, sender); } catch (Exception e) { messages = null; _logger.Warn("Failed to deserialize messages from " + sender, e); } //using (var stream = file.GetStream()) //{ // var lenEnumerator = new AsyncEnumerator(ae.ToString()); // try { lenEnumerator.BeginExecute(StreamUtil.ReadBytes(lenOfDataToReadBuffer, stream, lenEnumerator, "length data", false), ae.End()); } // catch (Exception exception) { _logger.Warn("Unable to read length data from " + remoteEndpoint, exception); yield break; } // yield return 1; // try { lenEnumerator.EndExecute(ae.DequeueAsyncResult()); } // catch (Exception e) { _logger.Warn("Unable to read length data from " + remoteEndpoint, e); yield break; } // var lengthOfDataToRead = BitConverter.ToInt32(lenOfDataToReadBuffer, 0); // if (lengthOfDataToRead < 0) { _logger.WarnFormat("Got invalid length {0} from sender {1}", lengthOfDataToRead, remoteEndpoint); yield break; } // _logger.DebugFormat("Reading {0} bytes from {1}", lengthOfDataToRead, remoteEndpoint); // var buffer = new byte[lengthOfDataToRead]; // var readBufferEnumerator = new AsyncEnumerator(ae.ToString()); // try { readBufferEnumerator.BeginExecute(StreamUtil.ReadBytes(buffer, stream, readBufferEnumerator, "message data", false), ae.End()); } // catch (Exception e) { _logger.Warn("Unable to read message data from " + remoteEndpoint, e); yield break; } // yield return 1; // try { readBufferEnumerator.EndExecute(ae.DequeueAsyncResult()); } // catch (Exception e) { _logger.Warn("Unable to read message data from " + remoteEndpoint, e); yield break; } // try { messages = SerializationExtensions.ToMessages(buffer); _logger.DebugFormat("Deserialized {0} messages from {1}", messages.Length, remoteEndpoint); } // catch (Exception exception) { _logger.Warn("Failed to deserialize messages from " + remoteEndpoint, exception); } //} if (messages == null) { //try { stream.BeginWrite(ProtocolConstants.SerializationFailureBuffer, 0, ProtocolConstants.SerializationFailureBuffer.Length, ae.End(), null); } //catch (Exception e) { _logger.Warn("Unable to send serialization format error to " + sender, e); yield break; } //yield return 1; //try { stream.EndWrite(ae.DequeueAsyncResult()); } //catch (Exception e) { _logger.Warn("Unable to send serialization format error to " + sender, e); } yield break; } IMessageAcceptance acceptance = null; byte[] errorBytes = null; try { acceptance = _acceptMessages(messages.ToArray()); _logger.DebugFormat("All messages from {0} were accepted", sender); } catch (QueueDoesNotExistsException) { _logger.WarnFormat("Failed to accept messages from {0} because queue does not exists", sender); errorBytes = ProtocolConstants.QueueDoesNoExiststBuffer; } catch (Exception e) { errorBytes = ProtocolConstants.ProcessingFailureBuffer; _logger.Warn("Failed to accept messages from " + sender, e); } if (errorBytes != null) { //try { stream.BeginWrite(errorBytes, 0, errorBytes.Length, ae.End(), null); } //catch (Exception exception) { _logger.Warn("Unable to send processing failure from " + sender, exception); yield break; } //yield return 1; //try { stream.EndWrite(ae.DequeueAsyncResult()); } //catch (Exception exception) { _logger.Warn("Unable to send processing failure from " + sender, exception); } yield break; } //_logger.DebugFormat("Sending reciept notice to {0}", sender); //try { stream.BeginWrite(ProtocolConstants.RecievedBuffer, 0, ProtocolConstants.RecievedBuffer.Length, ae.End(), null); } //catch (Exception exception) { _logger.Warn("Could not send reciept notice to " + sender, exception); acceptance.Abort(); yield break; } //yield return 1; //try { stream.EndWrite(ae.DequeueAsyncResult()); } //catch (Exception exception) { _logger.Warn("Could not send reciept notice to " + sender, exception); acceptance.Abort(); yield break; } //_logger.DebugFormat("Reading acknowledgement about accepting messages to {0}", sender); //var acknowledgementBuffer = new byte[ProtocolConstants.AcknowledgedBuffer.Length]; //var readAcknoweldgement = new AsyncEnumerator(ae.ToString()); //try //{ // readAcknoweldgement.BeginExecute( // StreamUtil.ReadBytes(acknowledgementBuffer, stream, readAcknoweldgement, "acknowledgement", false), // ae.End()); //} //catch (Exception exception) //{ // _logger.Warn("Error reading acknowledgement from " + sender, exception); // acceptance.Abort(); // yield break; //} //yield return 1; //try //{ // readAcknoweldgement.EndExecute(ae.DequeueAsyncResult()); //} //catch (Exception exception) //{ // _logger.Warn("Error reading acknowledgement from " + sender, exception); // acceptance.Abort(); // yield break; //} //var senderResponse = Encoding.Unicode.GetString(acknowledgementBuffer); //if (senderResponse != ProtocolConstants.Acknowledged) //{ // _logger.WarnFormat("Sender did not respond with proper acknowledgement, the reply was {0}", senderResponse); // acceptance.Abort(); //} //bool commitSuccessful; try { acceptance.Commit(); //commitSuccessful = true; } catch (Exception e) { _logger.Warn("Unable to commit messages from " + sender, e); //commitSuccessful = false; } //if (!commitSuccessful) //{ // bool writeSuccessful; // try { stream.BeginWrite(ProtocolConstants.RevertBuffer, 0, ProtocolConstants.RevertBuffer.Length, ae.End(), null); writeSuccessful = true; } // catch (Exception e) { _logger.Warn("Unable to send revert message to " + sender, e); writeSuccessful = false; } // if (writeSuccessful) // { // yield return 1; // try { stream.EndWrite(ae.DequeueAsyncResult()); } // catch (Exception exception) { _logger.Warn("Unable to send revert message to " + sender, exception); } // } //} } finally { var copy = CompletedRecievingMessages; if (copy != null) copy(); } }