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

Reply via email to