#! /bin/sh /usr/share/dpatch/dpatch-run
## xunlei_etc.dpatch by LI Daobing <lidaobing@debian.org>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: support xunlei, QQ xuanfeng and flashget URI
## DP: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=513388

@DPATCH@
diff -urNad multiget~/src/mgurlparser.cpp multiget/src/mgurlparser.cpp
--- multiget~/src/mgurlparser.cpp	2009-05-11 21:21:35.000000000 +0800
+++ multiget/src/mgurlparser.cpp	2009-05-11 21:37:06.000000000 +0800
@@ -84,6 +84,75 @@
 #define URL_RESERVED_CHAR(c) urlchr_test(c, urlchr_reserved)
 #define URL_UNSAFE_CHAR(c) urlchr_test(c, urlchr_unsafe)
 
+
+static inline int GetIndex(const char c)
+{
+   if (c >= 'A' && c <= 'Z')
+      return c - 'A';
+   else if (c >= 'a' && c <= 'z')
+      return c - 'a' + 26;
+   else if (c >= '0' && c <= '9')
+      return c - '0' + 52;
+   else if (c == '+')
+      return 62;
+   else if (c == '/')
+      return 63;
+   else if (c == '=')
+      return 64;
+
+   return -1;
+}
+
+static std::string ConvertXunleiLink(const std::string &xunlei_link)
+{
+   char chr1, chr2, chr3;
+   int  enc1, enc2, enc3, enc4;
+   int  i;
+   int  length = xunlei_link.length();
+
+   std::string decoded = "";
+
+   if (xunlei_link.compare(0, 10, "thunder://") == 0)
+      i = 10;
+   else if (xunlei_link.compare(0, 11, "flashget://") == 0)
+      i = 11;
+   else if (xunlei_link.compare(0, 7, "qqdl://") == 0)
+      i = 7;
+   else
+      return xunlei_link;
+
+   while (1)
+   {
+      enc1 = ((i < length) ? GetIndex(xunlei_link[i++]) : -1);
+      enc2 = ((i < length) ? GetIndex(xunlei_link[i++]) : -1);
+      enc3 = ((i < length) ? GetIndex(xunlei_link[i++]) : -1);
+      enc4 = ((i < length) ? GetIndex(xunlei_link[i++]) : -1);
+
+      if (enc1 == -1 || enc2 == -1 || enc3 == -1 || enc4 == -1)
+         break;
+
+      chr1 = (enc1 << 2) | (enc2 >> 4);
+      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
+      chr3 = ((enc3 & 3) << 6) | enc4;
+
+      decoded += chr1;
+
+      if (enc3 != 64)
+         decoded += chr2;
+
+      if (enc4 != 64)
+         decoded += chr3;
+   }
+
+   if (decoded.compare(0, 2, "AA") == 0)
+      return decoded.substr(2, decoded.rfind("ZZ") - 2);
+   else if (decoded.compare(0, 10, "[FLASHGET]") == 0)
+      return decoded.substr(10, decoded.rfind("[FLASHGET]") - 10);
+
+   return decoded;
+}
+
+
 
 CUrlParser::CUrlParser()
 {
@@ -95,6 +164,7 @@
 {
 
     Trim( url );
+    url = ConvertXunleiLink( url );
 
     m_bValidMirrorUrl = false;
     //协议检查
