📄 librarymaps.cpp
字号:
if ( pFile->m_pFolder != NULL )
{
m_pPathMap.SetAt( pFile->GetPath(), pFile );
}
else if ( m_pDeleted.Find( pFile ) == NULL )
{
m_pDeleted.AddTail( pFile );
}
if ( pFile->m_bSHA1 )
{
CLibraryFile** pHash = &m_pSHA1Map[ *(WORD*)&pFile->m_pSHA1 & HASH_MASK ];
pFile->m_pNextSHA1 = *pHash;
*pHash = pFile;
}
if ( pFile->m_bTiger )
{
CLibraryFile** pHash = &m_pTigerMap[ *(WORD*)&pFile->m_pTiger & HASH_MASK ];
pFile->m_pNextTiger = *pHash;
*pHash = pFile;
}
if ( pFile->m_bED2K )
{
CLibraryFile** pHash = &m_pED2KMap[ *(WORD*)&pFile->m_pED2K & HASH_MASK ];
pFile->m_pNextED2K = *pHash;
*pHash = pFile;
}
}
//////////////////////////////////////////////////////////////////////
// CLibraryMaps remove a file from the maps
void CLibraryMaps::OnFileRemove(CLibraryFile* pFile)
{
CLibraryFile* pOld;
if ( pFile->m_nIndex )
{
pOld = LookupFile( pFile->m_nIndex );
if ( pOld == pFile )
{
m_pIndexMap.RemoveKey( (LPVOID)pFile->m_nIndex );
m_nFiles --;
m_nVolume -= ( pFile->m_nSize >> 10 );
}
}
pOld = LookupFileByName( pFile->GetNameLC() );
if ( pOld == pFile ) m_pNameMap.RemoveKey( pFile->GetNameLC() );
if ( pFile->m_pFolder != NULL )
{
pOld = LookupFileByPath( pFile->GetPath() );
if ( pOld == pFile ) m_pPathMap.RemoveKey( pFile->GetPath() );
}
if ( POSITION pos = m_pDeleted.Find( pFile ) )
m_pDeleted.RemoveAt( pos );
if ( pFile->m_bSHA1 )
{
CLibraryFile** pPrev = &m_pSHA1Map[ *(WORD*)&pFile->m_pSHA1 & HASH_MASK ];
for ( CLibraryFile* pOther = *pPrev ; pOther ; pOther = pOther->m_pNextSHA1 )
{
if ( pOther == pFile )
{
*pPrev = pOther->m_pNextSHA1;
break;
}
pPrev = &pOther->m_pNextSHA1;
}
pFile->m_pNextSHA1 = NULL;
}
if ( pFile->m_bTiger )
{
CLibraryFile** pPrev = &m_pTigerMap[ *(WORD*)&pFile->m_pTiger & HASH_MASK ];
for ( CLibraryFile* pOther = *pPrev ; pOther ; pOther = pOther->m_pNextTiger )
{
if ( pOther == pFile )
{
*pPrev = pOther->m_pNextTiger;
break;
}
pPrev = &pOther->m_pNextTiger;
}
pFile->m_pNextTiger = NULL;
}
if ( pFile->m_bED2K )
{
CLibraryFile** pPrev = &m_pED2KMap[ *(WORD*)&pFile->m_pED2K & HASH_MASK ];
for ( CLibraryFile* pOther = *pPrev ; pOther ; pOther = pOther->m_pNextED2K )
{
if ( pOther == pFile )
{
*pPrev = pOther->m_pNextED2K;
break;
}
pPrev = &pOther->m_pNextED2K;
}
pFile->m_pNextED2K = NULL;
}
}
//////////////////////////////////////////////////////////////////////
// CLibraryMaps cull deleted files
void CLibraryMaps::CullDeletedFiles(CLibraryFile* pMatch)
{
if ( ! Library.Lock( 100 ) ) return;
CLibraryFile* pFile;
if ( pMatch->m_bSHA1 )
{
if ( pFile = LookupFileBySHA1( &pMatch->m_pSHA1 ) )
{
if ( ! pFile->IsAvailable() ) pFile->Delete();
}
}
if ( pMatch->m_bTiger )
{
if ( pFile = LookupFileByTiger( &pMatch->m_pTiger ) )
{
if ( ! pFile->IsAvailable() ) pFile->Delete();
}
}
if ( pMatch->m_bED2K )
{
if ( pFile = LookupFileByED2K( &pMatch->m_pED2K ) )
{
if ( ! pFile->IsAvailable() ) pFile->Delete();
}
}
Library.Unlock();
}
//////////////////////////////////////////////////////////////////////
// CLibraryMaps search
CPtrList* CLibraryMaps::Search(CQuerySearch* pSearch, int nMaximum, BOOL bLocal)
{
CPtrList* pHits = NULL;
if ( pSearch == NULL )
{
for ( POSITION pos = GetFileIterator() ; pos ; )
{
CLibraryFile* pFile = GetNextFile( pos );
if ( pFile->IsAvailable() )
{
if ( bLocal || ( pFile->IsShared() && pFile->m_bSHA1 ) )
{
if ( ! pHits ) pHits = new CPtrList( 64 );
pHits->AddTail( pFile );
}
}
}
}
else if ( pSearch->m_bSHA1 )
{
if ( CLibraryFile* pFile = LookupFileBySHA1( &pSearch->m_pSHA1 ) )
{
if ( bLocal || pFile->IsShared() )
{
pHits = new CPtrList();
pHits->AddTail( pFile );
if ( ! bLocal )
{
pFile->m_nHitsToday++;
pFile->m_nHitsTotal++;
}
}
}
}
else if ( pSearch->m_bTiger )
{
if ( CLibraryFile* pFile = LookupFileByTiger( &pSearch->m_pTiger ) )
{
if ( bLocal || pFile->IsShared() )
{
pHits = new CPtrList();
pHits->AddTail( pFile );
if ( ! bLocal )
{
pFile->m_nHitsToday++;
pFile->m_nHitsTotal++;
}
}
}
}
else if ( pSearch->m_bED2K )
{
for ( POSITION pos = GetFileIterator() ; pos ; )
{
CLibraryFile* pFile = GetNextFile( pos );
if ( pFile->m_bED2K && pFile->m_pED2K == pSearch->m_pED2K )
{
if ( bLocal || ( pFile->IsShared() && pFile->m_bSHA1 ) )
{
if ( ! pHits ) pHits = new CPtrList( 64 );
pHits->AddTail( pFile );
}
}
}
}
return pHits;
}
//////////////////////////////////////////////////////////////////////
// CLibraryMaps serialize
void CLibraryMaps::Serialize1(CArchive& ar, int nVersion)
{
if ( ar.IsStoring() )
{
ar << m_nNextIndex;
}
else
{
ar >> m_nNextIndex;
}
}
void CLibraryMaps::Serialize2(CArchive& ar, int nVersion)
{
if ( nVersion < 18 ) return;
if ( ar.IsStoring() )
{
ar.WriteCount( m_pDeleted.GetCount() );
for ( POSITION pos = m_pDeleted.GetHeadPosition() ; pos ; )
{
CLibraryFile* pFile = (CLibraryFile*)m_pDeleted.GetNext( pos );
pFile->Serialize( ar, nVersion );
}
}
else
{
for ( int nCount = ar.ReadCount() ; nCount > 0 ; nCount-- )
{
CLibraryFile* pFile = new CLibraryFile( NULL );
pFile->Serialize( ar, nVersion );
}
}
}
//////////////////////////////////////////////////////////////////////
// CLibrary ILibraryFiles
IMPLEMENT_DISPATCH(CLibraryMaps, LibraryFiles)
STDMETHODIMP CLibraryMaps::XLibraryFiles::get_Application(IApplication FAR* FAR* ppApplication)
{
METHOD_PROLOGUE( CLibraryMaps, LibraryFiles )
*ppApplication = Application.GetApp();
return S_OK;
}
STDMETHODIMP CLibraryMaps::XLibraryFiles::get_Library(ILibrary FAR* FAR* ppLibrary)
{
METHOD_PROLOGUE( CLibraryMaps, LibraryFiles )
*ppLibrary = (ILibrary*)Library.GetInterface( IID_ILibrary, TRUE );
return S_OK;
}
STDMETHODIMP CLibraryMaps::XLibraryFiles::get__NewEnum(IUnknown FAR* FAR* ppEnum)
{
METHOD_PROLOGUE( CLibraryMaps, LibraryFiles )
return E_NOTIMPL;
}
STDMETHODIMP CLibraryMaps::XLibraryFiles::get_Item(VARIANT vIndex, ILibraryFile FAR* FAR* ppFile)
{
METHOD_PROLOGUE( CLibraryMaps, LibraryFiles )
CLibraryFile* pFile = NULL;
*ppFile = NULL;
if ( vIndex.vt == VT_BSTR )
{
CString strName( vIndex.bstrVal );
if ( strName.Find( '\\' ) >= 0 )
pFile = pThis->LookupFileByPath( strName );
else
pFile = pThis->LookupFileByName( strName );
}
else
{
VARIANT va;
VariantInit( &va );
if ( FAILED( VariantChangeType( &va, (VARIANT FAR*)&vIndex, 0, VT_I4 ) ) )
return E_INVALIDARG;
if ( va.lVal < 0 || va.lVal >= pThis->GetFileCount() )
return E_INVALIDARG;
for ( POSITION pos = pThis->GetFileIterator() ; pos ; )
{
pFile = pThis->GetNextFile( pos );
if ( va.lVal-- == 0 ) break;
pFile = NULL;
}
}
*ppFile = pFile ? (ILibraryFile*)pFile->GetInterface( IID_ILibraryFile, TRUE ) : NULL;
return S_OK;
}
STDMETHODIMP CLibraryMaps::XLibraryFiles::get_Count(LONG FAR* pnCount)
{
METHOD_PROLOGUE( CLibraryMaps, LibraryFiles )
*pnCount = pThis->GetFileCount();
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -