Author: alanmc
Date: 2008-01-27 16:54:36 -0500 (Sun, 27 Jan 2008)
New Revision: 94090
Modified:
trunk/bitsharp/src/MonoTorrent/Client/Managers/TrackerManager.cs
trunk/bitsharp/src/MonoTorrent/Client/Tracker/HTTPTracker.cs
trunk/bitsharp/src/MonoTorrent/Client/Tracker/Tracker.cs
trunk/bitsharp/src/MonoTorrent/Client/Tracker/TrackerFactory.cs
trunk/bitsharp/src/MonoTorrent/Client/Tracker/TrackerTier.cs
trunk/bitsharp/src/MonoTorrent/Client/Tracker/UdpTracker.cs
Log:
Refactored the TrackerFactory to use a Uri as opposed to a plain string.
Implemented the first revision of UdpTracker support
Modified: trunk/bitsharp/src/MonoTorrent/Client/Managers/TrackerManager.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/Client/Managers/TrackerManager.cs
2008-01-27 21:54:05 UTC (rev 94089)
+++ trunk/bitsharp/src/MonoTorrent/Client/Managers/TrackerManager.cs
2008-01-27 21:54:36 UTC (rev 94090)
@@ -165,6 +165,7 @@
(long)((1 -
this.manager.Bitfield.PercentComplete / 100.0) * this.manager.Torrent.Size),
clientEvent, this.infoHash,
id, supportsEncryption, manager.Engine.PeerId,
null,
manager.Engine.Settings.ListenPort);
+ tracker.LastUpdated = DateTime.Now;
WaitHandle handle = tracker.Announce(p);
return handle;
}
Modified: trunk/bitsharp/src/MonoTorrent/Client/Tracker/HTTPTracker.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/Client/Tracker/HTTPTracker.cs
2008-01-27 21:54:05 UTC (rev 94089)
+++ trunk/bitsharp/src/MonoTorrent/Client/Tracker/HTTPTracker.cs
2008-01-27 21:54:36 UTC (rev 94090)
@@ -48,37 +48,37 @@
/// <summary>
/// The announce URL for this tracker
/// </summary>
- private string announceUrl;
+ private Uri announceUrl;
/// <summary>
/// The Scrape URL for this tracker
/// </summary>
- private string scrapeUrl;
+ private Uri scrapeUrl;
- public HTTPTracker(string announceUrl)
+ public HTTPTracker(Uri announceUrl)
: base()
{
this.announceUrl = announceUrl;
- int index = announceUrl.LastIndexOf('/');
- string part = (index + 9 <= announceUrl.Length) ?
announceUrl.Substring(index + 1, 8) : "";
+ int index = announceUrl.OriginalString.LastIndexOf('/');
+ string part = (index + 9 <= announceUrl.OriginalString.Length) ?
announceUrl.OriginalString.Substring(index + 1, 8) : "";
if (part.Equals("announce", StringComparison.OrdinalIgnoreCase))
{
CanScrape = true;
Regex r = new Regex("announce");
- this.scrapeUrl = r.Replace(announceUrl, "scrape", 1, index);
+ this.scrapeUrl = new Uri(r.Replace(announceUrl.OriginalString,
"scrape", 1, index));
}
}
public override WaitHandle Scrape(byte[] infohash, TrackerConnectionID
id)
{
HttpWebRequest request;
- string url = scrapeUrl;
+ string url = scrapeUrl.OriginalString;
// If set to false, you could retrieve scrape data for *all*
torrents hosted by the tracker. I see no practical use
// at the moment, so i've removed the ability to set this to false.
if (true)
{
- if (scrapeUrl.IndexOf('?') == -1)
+ if (url.IndexOf('?') == -1)
url += "?info_hash=" + infohash;
else
url += "&info_hash=" + infohash;
@@ -110,7 +110,7 @@
//base.LastUpdated = DateTime.Now;
// FIXME: This method should be tidied up. I don't like the way it
current works
sb.Append(this.announceUrl);
- sb.Append((this.announceUrl.IndexOf('?') == -1) ? '?' : '&');
+ sb.Append((this.announceUrl.OriginalString.IndexOf('?') == -1) ?
'?' : '&');
sb.Append("info_hash=");
sb.Append(HttpUtility.UrlEncode(parameters.Infohash));
sb.Append("&peer_id=");
@@ -393,7 +393,7 @@
public override string ToString()
{
- return this.announceUrl;
+ return this.announceUrl.OriginalString;
}
}
}
Modified: trunk/bitsharp/src/MonoTorrent/Client/Tracker/Tracker.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/Client/Tracker/Tracker.cs 2008-01-27
21:54:05 UTC (rev 94089)
+++ trunk/bitsharp/src/MonoTorrent/Client/Tracker/Tracker.cs 2008-01-27
21:54:36 UTC (rev 94090)
@@ -141,6 +141,7 @@
public DateTime LastUpdated
{
get { return lastUpdated; }
+ protected internal set { lastUpdated = value; }
}
Modified: trunk/bitsharp/src/MonoTorrent/Client/Tracker/TrackerFactory.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/Client/Tracker/TrackerFactory.cs
2008-01-27 21:54:05 UTC (rev 94089)
+++ trunk/bitsharp/src/MonoTorrent/Client/Tracker/TrackerFactory.cs
2008-01-27 21:54:36 UTC (rev 94090)
@@ -45,7 +45,7 @@
trackerTypes.Add(protocol, trackerType);
}
- public static Tracker CreateForProtocol(string protocol, string
announceUrl)
+ public static Tracker CreateForProtocol(string protocol, Uri
announceUrl)
{
Type type;
lock (locker)
Modified: trunk/bitsharp/src/MonoTorrent/Client/Tracker/TrackerTier.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/Client/Tracker/TrackerTier.cs
2008-01-27 21:54:05 UTC (rev 94089)
+++ trunk/bitsharp/src/MonoTorrent/Client/Tracker/TrackerTier.cs
2008-01-27 21:54:36 UTC (rev 94090)
@@ -47,22 +47,15 @@
for (int i = 0; i < trackerUrls.Count; i++)
{
- if (Uri.TryCreate(trackerUrls[i], UriKind.Absolute, out
result))
- {
- Tracker tracker =
TrackerFactory.CreateForProtocol(result.Scheme, trackerUrls[i]);
- if (tracker != null)
- {
- trackerList.Add(tracker);
- }
- else
- {
- Console.Error.WriteLine("Unsupported protocol {0}",
result);
- }
- }
+ // FIXME: Debug spew?
+ if (!Uri.TryCreate(trackerUrls[i], UriKind.Absolute, out
result))
+ continue;
+
+ Tracker tracker =
TrackerFactory.CreateForProtocol(result.Scheme, result);
+ if (tracker != null)
+ trackerList.Add(tracker);
else
- {
- Console.Error.WriteLine("Ignoring bad uri: {0}",
trackerUrls[i]);
- }
+ Console.Error.WriteLine("Unsupported protocol {0}",
result);
}
this.trackers = trackerList.ToArray();
Modified: trunk/bitsharp/src/MonoTorrent/Client/Tracker/UdpTracker.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/Client/Tracker/UdpTracker.cs 2008-01-27
21:54:05 UTC (rev 94089)
+++ trunk/bitsharp/src/MonoTorrent/Client/Tracker/UdpTracker.cs 2008-01-27
21:54:36 UTC (rev 94090)
@@ -2,22 +2,78 @@
using System.Collections.Generic;
using System.Text;
using System.Threading;
+using MonoTorrent.Client.Tracker.UdpTrackerMessages;
+using System.Net.Sockets;
+using System.Net;
namespace MonoTorrent.Client.Tracker
{
class UdpTracker : Tracker
{
- private string announceUrl;
- public UdpTracker(string announceUrl)
+ private AnnounceParameters storedParams;
+ private long connectionId;
+ private UdpClient tracker;
+ private Uri announceUrl;
+ private IPEndPoint endpoint;
+ bool hasConnected;
+ bool amConnecting;
+
+ public UdpTracker(Uri announceUrl)
{
+ base.CanScrape = false;
this.announceUrl = announceUrl;
+ endpoint = new IPEndPoint(IPAddress.Parse(announceUrl.Host),
announceUrl.Port);
+ tracker = new UdpClient(announceUrl.Host, announceUrl.Port);
}
public override WaitHandle Announce(AnnounceParameters parameters)
{
- throw new Exception("The method or operation is not implemented.");
+ if (!hasConnected && amConnecting)
+ return null;
+
+ if (!hasConnected)
+ {
+ storedParams = parameters;
+ amConnecting = true;
+ Connect();
+ return null;
+ }
+
+ AnnounceMessage m = new AnnounceMessage(connectionId, parameters);
+ tracker.Send(m.Encode(), m.ByteLength);
+ byte[] data = tracker.Receive(ref endpoint);
+ AnnounceResponseMessage response = new AnnounceResponseMessage();
+ response.Decode(data, 0, data.Length);
+ CompleteAnnounce(response.Peers);
+
+ return null;
}
+ private void CompleteAnnounce(List<Peer> list)
+ {
+ TrackerConnectionID id = new TrackerConnectionID(this, false,
MonoTorrent.Common.TorrentEvent.None, null);
+ AnnounceResponseEventArgs e = new AnnounceResponseEventArgs(id);
+ e.Successful = true;
+ e.Peers.AddRange(list);
+ RaiseAnnounceComplete(e);
+ }
+
+ private void Connect()
+ {
+ ConnectMessage message = new ConnectMessage();
+ tracker.Connect(announceUrl.Host, announceUrl.Port);
+ tracker.Send(message.Encode(), message.ByteLength);
+ byte[] response = tracker.Receive(ref endpoint);
+ ConnectResponseMessage m = new ConnectResponseMessage();
+ m.Decode(response, 0, response.Length);
+
+ connectionId = m.ConnectionId;
+ hasConnected = true;
+ amConnecting = false;
+ Announce(storedParams);
+ storedParams = null;
+ }
+
public override WaitHandle Scrape(byte[] infohash, TrackerConnectionID
id)
{
throw new Exception("The method or operation is not implemented.");
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches