MCPcopy Create free account
hub / github.com/amule-project/amule / FindHash

Method FindHash

src/SHAHashSet.cpp:102–150  ·  view source on GitHub ↗

recursive

Source from the content-addressed store, hash-verified

100
101// recursive
102CAICHHashTree* CAICHHashTree::FindHash(uint64 nStartPos, uint64 nSize, uint8* nLevel)
103{
104 (*nLevel)++;
105
106 wxCHECK(*nLevel <= 22, NULL);
107 wxCHECK(nStartPos + nSize <= m_nDataSize, NULL);
108 wxCHECK(nSize <= m_nDataSize, NULL);
109
110 if (nStartPos == 0 && nSize == m_nDataSize) {
111 // this is the searched hash
112 return this;
113 } else if (m_nDataSize <= m_nBaseSize) { // sanity
114 // this is already the last level, can't go deeper
115 wxFAIL;
116 return NULL;
117 } else {
118 uint64 nBlocks = m_nDataSize / m_nBaseSize + ((m_nDataSize % m_nBaseSize != 0 )? 1:0);
119 uint64 nLeft = (((m_bIsLeftBranch) ? nBlocks+1:nBlocks) / 2)* m_nBaseSize;
120 uint64 nRight = m_nDataSize - nLeft;
121 if (nStartPos < nLeft) {
122 if (nStartPos + nSize > nLeft) { // sanity
123 wxFAIL;
124 return NULL;
125 }
126
127 if (m_pLeftTree == NULL) {
128 m_pLeftTree = new CAICHHashTree(nLeft, true, (nLeft <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE);
129 } else {
130 wxASSERT( m_pLeftTree->m_nDataSize == nLeft );
131 }
132
133 return m_pLeftTree->FindHash(nStartPos, nSize, nLevel);
134 } else {
135 nStartPos -= nLeft;
136 if (nStartPos + nSize > nRight) { // sanity
137 wxFAIL;
138 return NULL;
139 }
140
141 if (m_pRightTree == NULL) {
142 m_pRightTree = new CAICHHashTree(nRight, false, (nRight <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE);
143 } else {
144 wxASSERT( m_pRightTree->m_nDataSize == nRight );
145 }
146
147 return m_pRightTree->FindHash(nStartPos, nSize, nLevel);
148 }
149 }
150}
151
152
153// recursive

Callers 6

ReadRecoveryDataMethod · 0.45
IsPartDataAvailableMethod · 0.45
DbgTestMethod · 0.45
CreateNextPartHashMethod · 0.45

Calls

no outgoing calls

Tested by

no test coverage detected