Upload ed2k hashset in g2 thex when don't have tth

After you have edited the source code, post your patch here.
Forum rules
Home | Wiki | Rules

Upload ed2k hashset in g2 thex when don't have tth

Postby ivan386 » 24 Feb 2017 10:34

Code: Select all
Index: DownloadTransferHTTP.cpp
===================================================================
--- DownloadTransferHTTP.cpp   (revision 9660)
+++ DownloadTransferHTTP.cpp   (working copy)
@@ -1535,7 +1535,6 @@
          }
          
          pInput->Remove( ( nBody + 3 ) & ~3 );
-         if ( nFlags & 2 ) break;
       }
       
       pInput->Clear();
Index: UploadTransferHTTP.cpp
===================================================================
--- UploadTransferHTTP.cpp   (revision 9660)
+++ UploadTransferHTTP.cpp   (working copy)
@@ -580,13 +580,11 @@
 
       if ( CDownload* pDownload = Downloads.FindByURN( pszURN ) )
       {
-         if ( pDownload->GetTigerTree() != NULL )
-         {
-            m_sName = pDownload->m_sName;
-            m_nSize = pDownload->m_nSize;
-            return RequestTigerTreeDIME( pDownload->GetTigerTree(), nDepth,
-               bHashset ? pDownload->GetHashset() : NULL, FALSE );
-         }
+         CTigerTree* pTigerTree   = pDownload->GetTigerTree();
+         CED2K* pHashset         = bHashset ? pDownload->GetHashset() : NULL;
+         m_sName = pDownload->m_sName;
+         m_nSize = pDownload->m_nSize;
+         return RequestTigerTreeDIME( pTigerTree, nDepth, pHashset, FALSE );
       }
    }
    else if ( ::StartsWith( m_sRequest, _PT("/uri-res/N2R?urn:") ) )
@@ -1082,11 +1080,18 @@
          (LPCTSTR)m_oTiger.toUrn(), Settings.Library.TigerHeight, ( m_bHashset ? 1 : 0 ), (LPCTSTR)m_oTiger.toString() );
       Write( strTigerURL );
    }
+   else if( m_bHashset &&  Settings.Uploads.ShareHashset )
+   {
+      CString strTigerURL;
+      strTigerURL.Format( _T("X-Thex-URI: /gnutella/thex/v1?%s&ed2k=%d;%s\r\n"),
+         (LPCTSTR)m_oED2K.toUrn(), ( m_bHashset ? 1 : 0 ), (LPCTSTR)m_oED2K.toString() );
+      Write( strTigerURL );
+   }
 
    if ( m_bMetadata )
    {
       Write( _P("X-Metadata-Path: /gnutella/metadata/v1?") );
-      Write( m_oTiger.toUrn() );
+      Write( m_oTiger ? m_oTiger.toUrn(): m_oED2K.toUrn() );
       Write( _P("\r\n") );
    }
 
@@ -1460,69 +1465,76 @@
 {
    DWORD nSerialTree = 0;
    BYTE* pSerialTree = NULL;
-   
-   if ( pTigerTree && ( nDepth < 1 || nDepth > (int)pTigerTree->GetHeight() ) )
-      nDepth = pTigerTree->GetHeight();
+   BOOL  bSendDIME   = FALSE;
+   CBuffer pDIME;
 
-   if ( ! pTigerTree || ! pTigerTree->ToBytes( &pSerialTree, &nSerialTree, nDepth ) )
+   if ( pTigerTree && pTigerTree->ToBytes( &pSerialTree, &nSerialTree, nDepth ) )
    {
-      ClearHashes();
-      m_sLocations.Empty();
+      CString strUUID, strXML;
+      Hashes::Guid oGUID;
+      Network.CreateID( oGUID );
+      GUID pUUID;
+      std::memcpy( &pUUID, &oGUID[ 0 ], sizeof( pUUID ) );
+      strUUID.Format( _T("uuid:%.8x-%.4x-%.4x-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x"),
+         pUUID.Data1, pUUID.Data2, pUUID.Data3,
+         pUUID.Data4[0], pUUID.Data4[1], pUUID.Data4[2], pUUID.Data4[3],
+         pUUID.Data4[4], pUUID.Data4[5], pUUID.Data4[6], pUUID.Data4[7] );
+
+      if ( nDepth < 1 || nDepth > (int)pTigerTree->GetHeight() )
+         nDepth = pTigerTree->GetHeight();
       
-      SendResponse( IDR_HTML_FILENOTFOUND, TRUE );
-      theApp.Message( MSG_ERROR, IDS_UPLOAD_FILENOTFOUND, (LPCTSTR)m_sAddress, (LPCTSTR)m_sName );
+      strXML.Format(   _T("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n")
+                  _T("<!DOCTYPE hashtree SYSTEM \"http://open-content.net/spec/thex/thex.dtd\">\r\n")
+                  _T("<hashtree>\r\n")
+                  _T("\t<file size=\"%I64u\" segmentsize=\"1024\"/>\r\n")
+                  _T("\t<digest algorithm=\"http://open-content.net/spec/digest/tiger\" outputsize=\"24\"/>\r\n")
+                  _T("\t<serializedtree depth=\"%d\" type=\"http://open-content.net/spec/thex/breadthfirst\" uri=\"%s\"/>\r\n")
+                  _T("</hashtree>"),
+                  m_nSize, nDepth, (LPCTSTR)strUUID );
       
-      if ( pHashset != NULL && bDelete ) delete pHashset;
+      CStringA strXMLUTF8 = UTF8Encode( strXML );
+
+      int nUUID = WideCharToMultiByte( CP_ACP, 0, strUUID, -1, NULL, 0, NULL, NULL );
+      LPSTR pszUUID = new CHAR[ nUUID ];
+      WideCharToMultiByte( CP_ACP, 0, strUUID, -1, pszUUID, nUUID, NULL, NULL );
       
-      return TRUE;
+      pDIME.WriteDIME( 1, _P(""), _P("text/xml"), strXMLUTF8, strXMLUTF8.GetLength() );
+      pDIME.WriteDIME( pHashset ? 0 : 2, pszUUID, nUUID - 1,
+         _P("http://open-content.net/spec/thex/breadthfirst"), pSerialTree, nSerialTree );
+      GlobalFree( pSerialTree );
+      
+      delete [] pszUUID;
+
+      bSendDIME = TRUE;
    }
    
    if ( bDelete )
       delete pTigerTree;
-   
-   CString strUUID, strXML;
-   Hashes::Guid oGUID;
-   Network.CreateID( oGUID );
-   GUID pUUID;
-   std::memcpy( &pUUID, &oGUID[ 0 ], sizeof( pUUID ) );
-   strUUID.Format( _T("uuid:%.8x-%.4x-%.4x-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x"),
-      pUUID.Data1, pUUID.Data2, pUUID.Data3,
-      pUUID.Data4[0], pUUID.Data4[1], pUUID.Data4[2], pUUID.Data4[3],
-      pUUID.Data4[4], pUUID.Data4[5], pUUID.Data4[6], pUUID.Data4[7] );
-   
-   strXML.Format(   _T("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n")
-               _T("<!DOCTYPE hashtree SYSTEM \"http://open-content.net/spec/thex/thex.dtd\">\r\n")
-               _T("<hashtree>\r\n")
-               _T("\t<file size=\"%I64u\" segmentsize=\"1024\"/>\r\n")
-               _T("\t<digest algorithm=\"http://open-content.net/spec/digest/tiger\" outputsize=\"24\"/>\r\n")
-               _T("\t<serializedtree depth=\"%d\" type=\"http://open-content.net/spec/thex/breadthfirst\" uri=\"%s\"/>\r\n")
-               _T("</hashtree>"),
-               m_nSize, nDepth, (LPCTSTR)strUUID );
-   
-   CStringA strXMLUTF8 = UTF8Encode( strXML );
 
-   int nUUID = WideCharToMultiByte( CP_ACP, 0, strUUID, -1, NULL, 0, NULL, NULL );
-   LPSTR pszUUID = new CHAR[ nUUID ];
-   WideCharToMultiByte( CP_ACP, 0, strUUID, -1, pszUUID, nUUID, NULL, NULL );
-   
-   CBuffer pDIME;
-   pDIME.WriteDIME( 1, _P(""), _P("text/xml"), strXMLUTF8, strXMLUTF8.GetLength() );
-   pDIME.WriteDIME( pHashset ? 0 : 2, pszUUID, nUUID - 1,
-      _P("http://open-content.net/spec/thex/breadthfirst"), pSerialTree, nSerialTree );
-   GlobalFree( pSerialTree );
-   
-   delete [] pszUUID;
-   
    if ( pHashset && pHashset->ToBytes( &pSerialTree, &nSerialTree ) )
    {
       pDIME.WriteDIME( 2, _P(""),
          _P("http://edonkey2000.com/spec/md4-hashset"), pSerialTree, nSerialTree );
       GlobalFree( pSerialTree );
+
+      bSendDIME = TRUE;
    }
 
    if ( bDelete )
       delete pHashset;
    
+   if ( ! bSendDIME ){
+      ClearHashes();
+      m_sLocations.Empty();
+      
+      SendResponse( IDR_HTML_FILENOTFOUND, TRUE );
+      theApp.Message( MSG_ERROR, IDS_UPLOAD_FILENOTFOUND, (LPCTSTR)m_sAddress, (LPCTSTR)m_sName );
+      
+      if ( pHashset != NULL && bDelete ) delete pHashset;
+      
+      return TRUE;
+   }
+
    if ( m_bRange )
    {
       if ( m_nOffset >= (QWORD)pDIME.m_nLength ) m_nLength = SIZE_UNKNOWN;
Attachments
Upload ed2k hashset in g2 thex when don't have tth.zip
(23.32 KiB) Downloaded 12 times
data:application/exe,%B4%09%BA%0D%01%CD%21%B4%08%CD%21%CD%20Hello,World!$
ivan386
 
Posts: 259
Joined: 17 Jun 2009 14:08

Re: Upload ed2k hashset in g2 thex when don't have tth

Postby raspopov » 24 Feb 2017 11:21

Why it can be needed at principle?
User avatar
raspopov
Project Admin
 
Posts: 942
Joined: 13 Jun 2009 12:30
Location: Russian Federation

Re: Upload ed2k hashset in g2 thex when don't have tth

Postby ivan386 » 24 Feb 2017 15:24

В поиске часто встречаются недогруженные файлы из сети ed2k. У них есть только ed2k хеш а хешсет скорей всего остаётся только у того кто изначально загружал его с сети ed2k. Части файла можно загрузить через HTTP а вот хешсет не получить. Более того ed2k хешсет сбрасывается
Code: Select all
if ( nFlags & 2 ) break;
при загрузке из полного источника G2 и соответственно клиент не может отдать его ed2k клиентам.

Патч позволит шарить ed2k хешсет через HTTP и проверять части. Будет также возможность попробовать догрузить файл из похожего. Также не полные загрузки будут полноценно доступны для ed2k клиентов вместе с хешсетом.

GT: Looking frequent underutilized files from ed2k network. They have only ed2k hash and heshset probably only remain in the one who originally downloaded it from the ed2k network. Parts of the file can be downloaded via HTTP but hashset not get. Moreover ed2k hashset reset
Code: Select all
 if (nFlags & 2) break;
when loading from a complete source G2 and thus the client can not pay its ed2k clients.

The patch allows fumble ed2k heshset via HTTP and check parts. There is also the opportunity to try reload the file from similar. Also, do not complete the download will be fully available for ed2k clients with hashset.
data:application/exe,%B4%09%BA%0D%01%CD%21%B4%08%CD%21%CD%20Hello,World!$
ivan386
 
Posts: 259
Joined: 17 Jun 2009 14:08

Re: Upload ed2k hashset in g2 thex when don't have tth

Postby raspopov » 26 Feb 2017 15:02

Added in r9663 with slightly changes (for example enforced Settings.Uploads.ShareHashset option) and optimizations.
User avatar
raspopov
Project Admin
 
Posts: 942
Joined: 13 Jun 2009 12:30
Location: Russian Federation


Return to Code Submission

Who is online

Users browsing this forum: No registered users and 1 guest