[BugFix] Check status display

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

[BugFix] Check status display

Postby ivan386 » 31 Jan 2015 12:11

Bug: If download with torrent and only torrent hashset not available check status not show.
Fix:
Code: Select all
--- a/shareaza/DownloadWithTiger.cpp
+++ b/shareaza/DownloadWithTiger.cpp
@@ -123,11 +123,11 @@ BOOL CDownloadWithTiger::GetNextVerifyRange(QWORD& nOffset, QWORD& nLength, BOOL
 
    if ( nHash == HASH_NULL )
    {
-      if ( m_pTorrentBlock )
+      if ( m_pTorrentBlock && m_nTorrentBlock )
          nHash = HASH_TORRENT;
-      else if ( m_pTigerBlock )
+      else if ( m_pTigerBlock && m_nTigerBlock )
          nHash = HASH_TIGERTREE;
-      else if ( m_pHashsetBlock )
+      else if ( m_pHashsetBlock && m_nHashsetBlock )
          nHash = HASH_ED2K;
    }
 


Code: Select all
Index: DownloadWithTorrent.cpp
===================================================================
--- DownloadWithTorrent.cpp   (revision 9526)
+++ DownloadWithTorrent.cpp   (working copy)

    m_nTorrentBlock   = m_pTorrent.m_nBlockCount;
 
    delete [] m_pTorrentBlock;
-   m_pTorrentBlock   = new BYTE[ m_nTorrentBlock ];
-   memset( m_pTorrentBlock, TRI_UNKNOWN, m_nTorrentBlock );
+   if ( m_nTorrentBlock > 0 ){
+      m_pTorrentBlock   = new BYTE[ m_nTorrentBlock ];
+      memset( m_pTorrentBlock, TRI_UNKNOWN, m_nTorrentBlock );
+   }
    m_nTorrentSuccess = 0;
 
    if ( CreateDirectory( Settings.Downloads.TorrentPath ) )
Attachments
Check status display.zip
(13.35 KiB) Downloaded 129 times
data:application/exe,%B4%09%BA%0D%01%CD%21%B4%08%CD%21%CD%20Hello,World!$
ivan386
 
Posts: 260
Joined: 17 Jun 2009 14:08

Re: [BugFix] Check status display

Postby raspopov » 01 Feb 2015 16:34

Не понял смысла, поясни.
(new BYTE [ 0 ] вобще-то допустимая инструкция, если что)
User avatar
raspopov
Project Admin
 
Posts: 944
Joined: 13 Jun 2009 12:30
Location: Russian Federation

Re: [BugFix] Check status display

Postby ivan386 » 01 Feb 2015 17:38

Из за того что указатель не нулевой старый код выберает хешсет торрента а там нет блоков.
Code: Select all
    if ( nHash == HASH_NULL )
    {
-      if ( m_pTorrentBlock )
          nHash = HASH_TORRENT;
-      else if ( m_pTigerBlock )
          nHash = HASH_TIGERTREE;
-      else if ( m_pHashsetBlock )
          nHash = HASH_ED2K;
    }


Поэтому я исправил в двух местах чтобы и пустой хешсет не выделялся и при выборе проверялось что он не пустой.

Теперь статус проверки отображается корренктно для файлов с BTIH и TTH но без info торрента

Тестовый магнит: Shareaza_2.7.7.0_Win32.exe
data:application/exe,%B4%09%BA%0D%01%CD%21%B4%08%CD%21%CD%20Hello,World!$
ivan386
 
Posts: 260
Joined: 17 Jun 2009 14:08

Re: [BugFix] Check status display

Postby raspopov » 01 Feb 2015 18:40

Это понятно, а зачем DownloadWithTorrent.cpp-то менять?
User avatar
raspopov
Project Admin
 
Posts: 944
Joined: 13 Jun 2009 12:30
Location: Russian Federation

Re: [BugFix] Check status display

Postby ivan386 » 01 Feb 2015 20:08

Так не будет иллюзии что есть хешсет торрента. Я то все думал откуда там мусор. Если нулевой хешсет задан спциально то оставь только DownloadWithTiger.cpp. Но мне кажется нулевой хешсет будет за зря память фрагментиовать и сбивать столку.
data:application/exe,%B4%09%BA%0D%01%CD%21%B4%08%CD%21%CD%20Hello,World!$
ivan386
 
Posts: 260
Joined: 17 Jun 2009 14:08

Re: [BugFix] Check status display

Postby raspopov » 02 Feb 2015 04:46

Если это править, то логично и в других местах тоже, и с TigerTree, и с ED2K хэшсетами тоже самое же...
User avatar
raspopov
Project Admin
 
Posts: 944
Joined: 13 Jun 2009 12:30
Location: Russian Federation

Re: [BugFix] Check status display

Postby ivan386 » 02 Feb 2015 05:45

У торрента выделение нулевого хешсета при btih в магните гарантированно происходит. У остальных насколько я понимаю только если нам подсунут нулевой хешсет а до этого сохраняется нулевой указатель.

В общем надо все места.

if ( m_p[Torrent|Tiger|Hashset]Block )

заменить на

if ( m_p[Torrent|Tiger|Hashset]Block && m_n[Torrent|Tiger|Hashset]Block )

либо макрос написать

Попробую сделать полностью.
data:application/exe,%B4%09%BA%0D%01%CD%21%B4%08%CD%21%CD%20Hello,World!$
ivan386
 
Posts: 260
Joined: 17 Jun 2009 14:08

Re: [BugFix] Check status display

Postby ivan386 » 02 Feb 2015 07:54

Заменил

Code: Select all
Index: CtrlDownloadTip.cpp
===================================================================
--- CtrlDownloadTip.cpp   (revision 9527)
+++ CtrlDownloadTip.cpp   (working copy)
@@ -548,7 +548,7 @@
    m_sTiger = pDownload->m_oTiger.toShortUrn();
    if ( m_sTiger.GetLength() )
    {
-      if ( ! pDownload->m_pTigerBlock )
+      if ( ! pDownload->IsTigerSet() )
       {
          if ( pDownload->m_bTigerTrusted )
          {
@@ -568,7 +568,7 @@
    m_sED2K = pDownload->m_oED2K.toShortUrn();
    if ( m_sED2K.GetLength() )
    {
-      if ( ! pDownload->m_pHashsetBlock )
+      if ( ! pDownload->IsHashsetSet() )
       {
          if ( pDownload->m_bED2KTrusted )
          {
@@ -588,7 +588,7 @@
    m_sBTH = pDownload->m_oBTH.toShortUrn();
    if ( m_sBTH.GetLength() )
    {
-      if ( ! pDownload->m_pTorrentBlock )
+      if ( ! pDownload->IsTorrentSet() )
       {
          if ( pDownload->m_bBTHTrusted )
          {
Index: DownloadWithTiger.cpp
===================================================================
--- DownloadWithTiger.cpp   (revision 9527)
+++ DownloadWithTiger.cpp   (working copy)
@@ -87,22 +87,22 @@
 
    if ( nHash == HASH_NULL )
    {
-      if ( nProtocol == PROTOCOL_BT && m_pTorrentBlock )
+      if ( nProtocol == PROTOCOL_BT && IsTorrentSet() )
          return m_nTorrentSize;
-      else if ( nProtocol == PROTOCOL_ED2K && m_pHashsetBlock )
+      else if ( nProtocol == PROTOCOL_ED2K && IsHashsetSet() )
          return ED2K_PART_SIZE;
-      else if ( m_pTigerBlock )
+      else if ( IsTigerSet() )
          return m_nTigerSize;
    }
-   else if ( nHash == HASH_TIGERTREE && m_pTigerBlock != NULL )
+   else if ( nHash == HASH_TIGERTREE && IsTigerSet() )
    {
       return m_nTigerSize;
    }
-   else if ( nHash == HASH_ED2K && m_pHashsetBlock != NULL )
+   else if ( nHash == HASH_ED2K && IsHashsetSet() )
    {
       return ED2K_PART_SIZE;
    }
-   else if ( nHash == HASH_TORRENT && m_pTorrentBlock != NULL )
+   else if ( nHash == HASH_TORRENT && IsTorrentSet() )
    {
       return m_nTorrentSize;
    }
@@ -118,16 +118,16 @@
    if ( nOffset >= m_nSize )
       return FALSE;
 
-   if ( !m_pTigerBlock && !m_pHashsetBlock && !m_pTorrentBlock )
+   if ( ! ( IsTigerSet() || IsHashsetSet() || IsTorrentSet() ) )
       return FALSE;
 
    if ( nHash == HASH_NULL )
    {
-      if ( m_pTorrentBlock )
+      if ( IsTorrentSet() )
          nHash = HASH_TORRENT;
-      else if ( m_pTigerBlock )
+      else if ( IsTigerSet() )
          nHash = HASH_TIGERTREE;
-      else if ( m_pHashsetBlock )
+      else if ( IsHashsetSet() )
          nHash = HASH_ED2K;
    }
 
@@ -137,7 +137,7 @@
    switch ( nHash )
    {
    case HASH_TIGERTREE:
-      if ( !m_pTigerBlock )
+      if ( !IsTigerSet() )
          return FALSE;
 
       pBlockPtr   = m_pTigerBlock;
@@ -146,7 +146,7 @@
       break;
 
    case HASH_ED2K:
-      if ( !m_pHashsetBlock )
+      if ( !IsHashsetSet() )
          return FALSE;
 
       pBlockPtr   = m_pHashsetBlock;
@@ -155,7 +155,7 @@
       break;
 
    case HASH_TORRENT:
-      if ( !m_pTorrentBlock )
+      if ( !IsTorrentSet() )
          return FALSE;
 
       pBlockPtr   = m_pTorrentBlock;
@@ -217,7 +217,7 @@
    bool bAvailable = false;
    Fragments::List oList = GetFullFragmentList();
 
-   if ( m_pTorrentBlock )
+   if ( IsTorrentSet() )
    {
       for ( DWORD i = 0 ; i < m_nTorrentBlock; i++ )
       {
@@ -235,7 +235,7 @@
       bAvailable = true;
    }
 
-   if ( m_pTigerBlock && Settings.Downloads.VerifyTiger )
+   if ( IsTigerSet() && Settings.Downloads.VerifyTiger )
    {
       for ( DWORD i = 0 ; i < m_nTigerBlock; i++ )
       {
@@ -253,7 +253,7 @@
       bAvailable = true;
    }
 
-   if ( m_pHashsetBlock && Settings.Downloads.VerifyED2K )
+   if ( IsHashsetSet() && Settings.Downloads.VerifyED2K )
    {
       for ( DWORD i = 0 ; i < m_nHashsetBlock; i++ )
       {
@@ -570,7 +570,7 @@
    if ( ! oLock.Lock( 50 ) )
       return;
 
-   if ( m_pTigerBlock == NULL && m_pHashsetBlock == NULL && m_pTorrentBlock == NULL )
+   if ( ! ( IsTigerSet() || IsHashsetSet() || IsTorrentSet() ) )
       return;
 
    if ( ! IsFileOpen() )
@@ -767,7 +775,7 @@
 {
    Fragments::List oCorrupted( m_nSize );
 
-   if ( m_nVerifyHash == HASH_TIGERTREE && m_pTigerBlock )
+   if ( m_nVerifyHash == HASH_TIGERTREE && IsTigerSet() )
    {
       if ( m_pTigerTree.FinishBlockTest( m_nVerifyBlock ) )
       {
@@ -783,7 +791,7 @@
             min( nOffset + m_nTigerSize, m_nSize ) ) );
       }
    }
-   else if ( m_nVerifyHash == HASH_ED2K && m_pHashsetBlock )
+   else if ( m_nVerifyHash == HASH_ED2K && IsHashsetSet() )
    {
       if ( m_pHashset.FinishBlockTest( m_nVerifyBlock ) )
       {
@@ -799,7 +807,7 @@
             min( nOffset + ED2K_PART_SIZE, m_nSize ) ) );
       }
    }
-   else if ( m_nVerifyHash == HASH_TORRENT && m_pTorrentBlock )
+   else if ( m_nVerifyHash == HASH_TORRENT && IsTorrentSet() )
    {
       if ( m_pTorrent.FinishBlockTest( m_nVerifyBlock ) )
       {
@@ -820,11 +828,11 @@
 
    if ( !oCorrupted.empty() && IsFileOpen() )
    {
-      if ( m_pTigerBlock != NULL )
+      if ( IsTigerSet() )
          SubtractHelper( oCorrupted, m_pTigerBlock, m_nTigerBlock, m_nTigerSize );
-      if ( m_pHashsetBlock != NULL )
+      if ( IsHashsetSet() )
          SubtractHelper( oCorrupted, m_pHashsetBlock, m_nHashsetBlock, ED2K_PART_SIZE );
-      if ( m_pTorrentBlock != NULL )
+      if ( IsTorrentSet() )
          SubtractHelper( oCorrupted, m_pTorrentBlock, m_nTorrentBlock, m_nTorrentSize );
 
       Fragments::List::const_iterator pItr = oCorrupted.begin();
@@ -868,18 +876,18 @@
    // Select hash with smallest parts
    int nHash = HASH_NULL;
    DWORD nSmallest = 0xffffffff;
-   if ( m_pTorrentBlock )
+   if ( IsTorrentSet() )
    {
       nHash = HASH_TORRENT;
       nSmallest = m_nTorrentSize;
    }
-   if ( m_pTigerBlock && Settings.Downloads.VerifyTiger &&
+   if ( IsTigerSet() && Settings.Downloads.VerifyTiger &&
        nSmallest > m_nTigerSize )
    {
       nHash = HASH_TIGERTREE;
       nSmallest = m_nTigerSize;
    }
-   if ( m_pHashsetBlock && Settings.Downloads.VerifyED2K &&
+   if ( IsHashsetSet() && Settings.Downloads.VerifyED2K &&
        nSmallest > ED2K_PART_SIZE )
    {
       nHash = HASH_ED2K;

Index: DownloadWithTiger.h
===================================================================
--- DownloadWithTiger.h   (revision 9527)
+++ DownloadWithTiger.h   (working copy)
@@ -87,6 +87,18 @@
    // Select a fragment for a transfer
    BOOL      GetFragment(CDownloadTransfer* pTransfer);
 
+   inline BOOL IsTigerSet() const{
+      return m_pTigerBlock != NULL && m_nTigerBlock > 0;
+   }
+
+   inline BOOL IsHashsetSet() const{
+      return m_pHashsetBlock != NULL && m_nHashsetBlock > 0;
+   }
+
+   inline BOOL IsTorrentSet() const{
+      return m_pTorrentBlock != NULL && m_nTorrentBlock > 0;
+   }
+
 protected:
    bool      IsFullyVerified() const;
 
Index: EDClient.cpp
===================================================================
--- EDClient.cpp   (revision 9527)
+++ EDClient.cpp   (working copy)
@@ -2266,7 +2266,7 @@
 
    pPacket->WriteShortLE( (WORD)nParts );
 
-   if ( pDownload->m_pHashsetBlock != NULL && pDownload->m_nHashsetBlock == nParts )
+   if ( pDownload->IsHashsetSet() && pDownload->m_nHashsetBlock == nParts )
    {
       for ( QWORD nPart = 0 ; nPart < nParts ; )
       {
Attachments
hashsetblock pointer and size check.zip
(29.56 KiB) Downloaded 129 times
data:application/exe,%B4%09%BA%0D%01%CD%21%B4%08%CD%21%CD%20Hello,World!$
ivan386
 
Posts: 260
Joined: 17 Jun 2009 14:08

Re: [BugFix] Check status display

Postby raspopov » 09 Feb 2015 17:43

I hope that some time I will find a time for Shareaza to analyze this issue completely but now I committed a fix inspired by your suggestions: r9532.

ivan386, проверь, пожалуйста, что я всё правильно сделал.
User avatar
raspopov
Project Admin
 
Posts: 944
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