MailServer/MailServer/LumiSoft/Misc/SocketBufferedWriter.cs
2010-07-11 21:52:34 +00:00

96 lines
2.8 KiB
C#

using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using LumiSoft.Misc.SocketServer;
namespace LumiSoft.Misc
{
/// <summary>
/// Implements buffered writer for socket.
/// </summary>
//[Obsolete("Get rid of it.")]
public class SocketBufferedWriter
{
private SocketEx m_pSocket = null;
private int m_BufferSize = 8000;
private byte[] m_Buffer = null;
private int m_AvailableInBuffer = 0;
/// <summary>
/// Default constructor.
/// </summary>
/// <param name="socket">Socket where to write data.</param>
public SocketBufferedWriter(SocketEx socket)
{
m_pSocket = socket;
m_Buffer = new byte[m_BufferSize];
}
#region method Flush
/// <summary>
/// Forces to send all data in buffer to destination host.
/// </summary>
public void Flush()
{
if (m_AvailableInBuffer > 0)
{
m_pSocket.Write(m_Buffer, 0, m_AvailableInBuffer);
m_AvailableInBuffer = 0;
}
}
#endregion
#region method Write
/// <summary>
/// Queues specified data to write buffer. If write buffer is full, buffered data will be sent to detination host.
/// </summary>
/// <param name="data">Data to queue.</param>
public void Write(string data)
{
Write(System.Text.Encoding.UTF8.GetBytes(data));
}
/// <summary>
/// Queues specified data to write buffer. If write buffer is full, buffered data will be sent to detination host.
/// </summary>
/// <param name="data">Data to queue.</param>
public void Write(byte[] data)
{
// There is no room to accomodate data to buffer
if ((m_AvailableInBuffer + data.Length) > m_BufferSize)
{
// Send buffer data
m_pSocket.Write(m_Buffer, 0, m_AvailableInBuffer);
m_AvailableInBuffer = 0;
// Store new data to buffer
if (data.Length < m_BufferSize)
{
Array.Copy(data, m_Buffer, data.Length);
m_AvailableInBuffer = data.Length;
}
// Buffer is smaller than data, send it directly
else
{
m_pSocket.Write(data);
}
}
// Store data to buffer
else
{
Array.Copy(data, 0, m_Buffer, m_AvailableInBuffer, data.Length);
m_AvailableInBuffer += data.Length;
}
}
#endregion
}
}