/// <summary> /// Private constructor for initializing <b>server side</b> sessions. /// </summary> /// <param name="router">The message router.</param> /// <param name="msg">The <see cref="ReliableTransferMsg" /> that initiated this session.</param> /// <param name="direction">The transfer direction supported by the server.</param> /// <param name="stream">The input or output stream.</param> /// <exception cref="InvalidOperationException"> /// Thrown if the client requested transfer direction does not match the /// direction implied by this method. /// </exception> private StreamTransferSession(MsgRouter router, ReliableTransferMsg msg, TransferDirection direction, EnhancedStream stream) { if (direction != msg.Direction) { throw new InvalidOperationException(string.Format("Transfer direction [{0}] is not supported.", msg.Direction)); } ReliableTransferHandler handler; reliableSession = msg.Session; reliableSession.SessionHandler = handler = new ReliableTransferHandler(reliableSession); handler.BeginTransferEvent += new ReliableTransferDelegate(OnBeginTransfer); handler.EndTransferEvent += new ReliableTransferDelegate(OnEndTransfer); if (direction == TransferDirection.Upload) { handler.ReceiveEvent += new ReliableTransferDelegate(OnReceive); } else { handler.SendEvent += new ReliableTransferDelegate(OnSend); } this.router = router; this.direction = direction; this.args = msg.Args; this.stream = stream; this.started = false; this.closed = false; this.arTransfer = null; this.simError = false; this.simCancel = false; this.delay = 0; }
/// <summary> /// Private constructor for initializing <b>client side</b> sessions. /// </summary> /// <param name="router">The message router.</param> /// <param name="serverEP">The server endpoint.</param> /// <param name="direction">The transfer direction.</param> /// <param name="stream">The input or output stream.</param> private StreamTransferSession(MsgRouter router, MsgEP serverEP, TransferDirection direction, EnhancedStream stream) { ReliableTransferHandler handler; reliableSession = router.CreateReliableTransferSession(); reliableSession.SessionHandler = handler = new ReliableTransferHandler(reliableSession); handler.BeginTransferEvent += new ReliableTransferDelegate(OnBeginTransfer); handler.EndTransferEvent += new ReliableTransferDelegate(OnEndTransfer); if (direction == TransferDirection.Upload) { handler.SendEvent += new ReliableTransferDelegate(OnSend); } else { handler.ReceiveEvent += new ReliableTransferDelegate(OnReceive); } this.router = router; this.serverEP = serverEP; this.direction = direction; this.args = null; this.stream = stream; this.started = false; this.closed = false; this.streamClosed = false; this.arTransfer = null; this.simError = false; this.simCancel = false; this.delay = 0; }
private void OnReceive(ReliableTransferHandler sender, ReliableTransferArgs args) { if (simError) { throw new Exception("Simulated error."); } if (simCancel) { sender.Session.Cancel(); return; } if (delay > 0) { Thread.Sleep(delay); } stream.WriteBytesNoLen(args.BlockData); }
private void OnSend(ReliableTransferHandler sender, ReliableTransferArgs args) { if (simError) { throw new Exception("Simulated error."); } if (simCancel) { sender.Session.Cancel(); return; } if (delay > 0) { Thread.Sleep(delay); } args.BlockData = stream.ReadBytes(args.BlockSize); }
private void OnEndTransfer(ReliableTransferHandler sender, ReliableTransferArgs args) { CloseStream(); if (reliableSession.IsServer) { if (arTransfer.Callback != null) { arTransfer.Notify(args.Exception); } else { // No callback so we'll handle the termination ourselves. arTransfer.Dispose(); closed = true; } } // Note that client side notification is handled by the // ReliableTransferSession class. }
//--------------------------------------------------------------------- // ReliableTransferHandler event handlers private void OnBeginTransfer(ReliableTransferHandler sender, ReliableTransferArgs args) { }