73 lines
2.6 KiB
C#
73 lines
2.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using Hermes.Objects;
|
|
|
|
namespace Hermes.CircuitManagers
|
|
{
|
|
public class HostSectionedCircuitManager : OneShotRoundRobinCircuitManager
|
|
{
|
|
public Dictionary<String, Objects.Circuit> DestinationDictionary { get; set; }
|
|
|
|
public HostSectionedCircuitManager()
|
|
{
|
|
DestinationDictionary = new Dictionary<string, Circuit>();
|
|
}
|
|
protected override void AssignStream(Objects.Stream stream)
|
|
{
|
|
Circuit circ = null;
|
|
lock (DestinationDictionary)
|
|
{
|
|
if (DestinationDictionary.ContainsKey(stream.DestinationHost))
|
|
circ = DestinationDictionary[stream.DestinationHost];
|
|
else
|
|
{
|
|
circ = GetCircuitForStream(stream);
|
|
while (circ == null)
|
|
{ //There is not yet a circuit
|
|
//Wait for more circuits to build
|
|
System.Threading.Thread.Sleep(5000);
|
|
circ = GetCircuitForStream(stream);
|
|
}
|
|
DestinationDictionary.Add(stream.DestinationHost, circ);
|
|
}
|
|
}
|
|
try
|
|
{
|
|
AssignStreamToCircuit(stream, circ);
|
|
}
|
|
catch (TorControlLibrary.Exceptions.TorUnknownCircuitException e)
|
|
{ //The circuit has become invalidated, most likely due to it closing.
|
|
//cleanup
|
|
RemoveCircuit(circ);
|
|
//try
|
|
//{
|
|
// _controlConnection.CloseCircuit(circ.CircuitID);
|
|
//}
|
|
//catch (Exception) { }
|
|
//Call this function again, with hopefully better results next time
|
|
AssignStream(stream);
|
|
}
|
|
catch (TorControlLibrary.Exceptions.TorUnknownStreamException e)
|
|
{ //Stream no longer exists, clean up and exit
|
|
RemoveStream(stream);
|
|
try
|
|
{
|
|
_controlConnection.CloseStream(stream.StreamID);
|
|
}
|
|
catch (Exception) { }
|
|
}
|
|
}
|
|
public override void RemoveCircuit(Circuit circuit)
|
|
{
|
|
lock (DestinationDictionary)
|
|
{
|
|
if (DestinationDictionary.ContainsValue(circuit))
|
|
DestinationDictionary.Remove(DestinationDictionary.First(p => p.Value.Equals(circuit)).Key);
|
|
}
|
|
base.RemoveCircuit(circuit);
|
|
}
|
|
}
|
|
}
|