📄 sharedfolder.cpp
字号:
}
else if ( _tcsnicmp( pFind.cFileName, _T("__INCOMPLETE___"), 15 ) == 0 )
{
// Ignore WinMX partial files
continue;
}
else
{
pLock.Lock();
pFile = new CLibraryFile( this, pFind.cFileName );
m_pFiles.SetAt( pFile->GetNameLC(), pFile );
m_nFiles++;
bChanged = TRUE;
pLock.Unlock();
}
QWORD nLongSize = (QWORD)pFind.nFileSizeLow | ( (QWORD)pFind.nFileSizeHigh << 32 );
bChanged |= pFile->ThreadScan( pLock, nScanCookie, nLongSize,
&pFind.ftLastWriteTime, pszMetaData );
m_nVolume += pFile->m_nSize / 1024;
}
}
while ( Library.m_bThread && FindNextFile( hSearch, &pFind ) );
FindClose( hSearch );
}
if ( ! Library.m_bThread ) return FALSE;
for ( POSITION pos = GetFolderIterator() ; pos ; )
{
CLibraryFolder* pFolder = GetNextFolder( pos );
if ( pFolder->m_nScanCookie != nScanCookie )
{
CString strNameLC( pFolder->m_sName );
strNameLC.MakeLower();
m_nFiles -= pFolder->m_nFiles;
m_nVolume -= pFolder->m_nVolume;
if ( ! pLock.IsLocked() ) pLock.Lock();
m_pFolders.RemoveKey( strNameLC );
pFolder->OnDelete();
bChanged = TRUE;
m_nUpdateCookie++;
}
}
for ( pos = GetFileIterator() ; pos ; )
{
CLibraryFile* pFile = GetNextFile( pos );
if ( pFile->m_nScanCookie != nScanCookie )
{
CString strNameLC( pFile->m_sName );
strNameLC.MakeLower();
m_nFiles --;
m_nVolume -= pFile->m_nSize / 1024;
if ( ! pLock.IsLocked() ) pLock.Lock();
pFile->OnDelete();
m_pFiles.RemoveKey( strNameLC );
bChanged = TRUE;
}
}
if ( m_pParent == NULL )
theApp.Message( MSG_DEBUG, _T("Finnished scanning (%i)"), bChanged );
return bChanged;
}
//////////////////////////////////////////////////////////////////////
// CLibraryFolder monitor
BOOL CLibraryFolder::SetMonitor()
{
if ( ! m_bMonitor )
{
m_bMonitor = TRUE;
if ( m_hMonitor != INVALID_HANDLE_VALUE ) FindCloseChangeNotification( m_hMonitor );
m_hMonitor = INVALID_HANDLE_VALUE;
if ( ! Settings.Library.WatchFolders ) return FALSE;
m_hMonitor = FindFirstChangeNotification( m_sPath, TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME|
FILE_NOTIFY_CHANGE_SIZE|FILE_NOTIFY_CHANGE_LAST_WRITE );
}
return ( m_hMonitor != INVALID_HANDLE_VALUE );
}
BOOL CLibraryFolder::CheckMonitor()
{
if ( ! m_bMonitor ) return TRUE;
if ( m_hMonitor == INVALID_HANDLE_VALUE ) return FALSE;
if ( WaitForSingleObject( m_hMonitor, 0 ) != WAIT_OBJECT_0 ) return FALSE;
if ( ! FindNextChangeNotification( m_hMonitor ) )
{
FindCloseChangeNotification( m_hMonitor );
m_hMonitor = INVALID_HANDLE_VALUE;
}
return TRUE;
}
//////////////////////////////////////////////////////////////////////
// CLibraryFolder scan
void CLibraryFolder::Scan()
{
for ( CLibraryFolder* pFolder = this ; pFolder->m_pParent ; pFolder = pFolder->m_pParent );
if ( pFolder ) pFolder->m_bMonitor = FALSE;
Library.m_pWakeup.SetEvent();
}
//////////////////////////////////////////////////////////////////////
// CLibraryFolder shared check
BOOL CLibraryFolder::IsShared()
{
for ( CLibraryFolder* pFolder = this ; pFolder ; pFolder = pFolder->m_pParent )
{
if ( pFolder->m_bShared )
{
if ( pFolder->m_bShared == TS_TRUE ) return TRUE;
if ( pFolder->m_bShared == TS_FALSE ) return FALSE;
}
}
return TRUE;
}
//////////////////////////////////////////////////////////////////////
// CLibraryFolder callbacks
void CLibraryFolder::OnDelete()
{
for ( POSITION pos = GetFolderIterator() ; pos ; )
{
GetNextFolder( pos )->OnDelete();
}
for ( pos = GetFileIterator() ; pos ; )
{
GetNextFile( pos )->OnDelete();
}
m_pFolders.RemoveAll();
m_pFiles.RemoveAll();
delete this;
}
void CLibraryFolder::OnFileRename(CLibraryFile* pFile)
{
for ( POSITION pos = m_pFiles.GetStartPosition() ; pos ; )
{
CLibraryFile* pOld = NULL;
CString strName;
m_pFiles.GetNextAssoc( pos, strName, (CObject*&)pOld );
if ( pFile == pOld )
{
m_pFiles.RemoveKey( strName );
m_pFiles.SetAt( pFile->GetNameLC(), pFile );
break;
}
}
}
//////////////////////////////////////////////////////////////////////
// CLibraryFolder ILibraryFolder
IMPLEMENT_DISPATCH(CLibraryFolder, LibraryFolder)
STDMETHODIMP CLibraryFolder::XLibraryFolder::get_Application(IApplication FAR* FAR* ppApplication)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFolder )
*ppApplication = Application.GetApp();
return S_OK;
}
STDMETHODIMP CLibraryFolder::XLibraryFolder::get_Library(ILibrary FAR* FAR* ppLibrary)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFolder )
*ppLibrary = (ILibrary*)Library.GetInterface( IID_ILibrary, TRUE );
return S_OK;
}
STDMETHODIMP CLibraryFolder::XLibraryFolder::get_Parent(ILibraryFolder FAR* FAR* ppFolder)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFolder )
if ( pThis->m_pParent )
*ppFolder = (ILibraryFolder*)pThis->m_pParent->GetInterface( IID_ILibraryFolder, TRUE );
else
*ppFolder = NULL;
return S_OK;
}
STDMETHODIMP CLibraryFolder::XLibraryFolder::get_Path(BSTR FAR* psPath)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFolder )
pThis->m_sPath.SetSysString( psPath );
return S_OK;
}
STDMETHODIMP CLibraryFolder::XLibraryFolder::get_Name(BSTR FAR* psPath)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFolder )
pThis->m_sName.SetSysString( psPath );
return S_OK;
}
STDMETHODIMP CLibraryFolder::XLibraryFolder::get_Shared(STRISTATE FAR* pnValue)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFolder )
*pnValue = (STRISTATE)pThis->m_bShared;
return S_OK;
}
STDMETHODIMP CLibraryFolder::XLibraryFolder::put_Shared(STRISTATE nValue)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFolder )
pThis->m_bShared = nValue;
return S_OK;
}
STDMETHODIMP CLibraryFolder::XLibraryFolder::get_EffectiveShared(VARIANT_BOOL FAR* pbValue)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFolder )
*pbValue = pThis->IsShared() ? VARIANT_TRUE : VARIANT_FALSE;
return S_OK;
}
STDMETHODIMP CLibraryFolder::XLibraryFolder::get_Folders(ILibraryFolders FAR* FAR* ppFolders)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFolder )
*ppFolders = (ILibraryFolders*)pThis->GetInterface( IID_ILibraryFolders, TRUE );
return S_OK;
}
STDMETHODIMP CLibraryFolder::XLibraryFolder::get_Files(ILibraryFiles FAR* FAR* ppFiles)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFolder )
*ppFiles = (ILibraryFiles*)pThis->GetInterface( IID_ILibraryFiles, TRUE );
return S_OK;
}
//////////////////////////////////////////////////////////////////////
// CLibraryFolder ILibraryFolders
IMPLEMENT_DISPATCH(CLibraryFolder, LibraryFolders)
STDMETHODIMP CLibraryFolder::XLibraryFolders::get_Application(IApplication FAR* FAR* ppApplication)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFolders )
*ppApplication = Application.GetApp();
return S_OK;
}
STDMETHODIMP CLibraryFolder::XLibraryFolders::get_Library(ILibrary FAR* FAR* ppLibrary)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFolders )
*ppLibrary = (ILibrary*)Library.GetInterface( IID_ILibrary, TRUE );
return S_OK;
}
STDMETHODIMP CLibraryFolder::XLibraryFolders::get__NewEnum(IUnknown FAR* FAR* ppEnum)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFolders )
return E_NOTIMPL;
}
STDMETHODIMP CLibraryFolder::XLibraryFolders::get_Item(VARIANT vIndex, ILibraryFolder FAR* FAR* ppFolder)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFolders )
CLibraryFolder* pFolder = NULL;
*ppFolder = NULL;
if ( vIndex.vt == VT_BSTR )
{
CString strName( vIndex.bstrVal );
if ( strName.Find( '\\' ) >= 0 )
pFolder = pThis->GetFolderByPath( strName );
else
pFolder = pThis->GetFolderByName( 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->GetFolderCount() )
return E_INVALIDARG;
for ( POSITION pos = pThis->GetFolderIterator() ; pos ; )
{
pFolder = pThis->GetNextFolder( pos );
if ( va.lVal-- == 0 ) break;
pFolder = NULL;
}
}
*ppFolder = pFolder ? (ILibraryFolder*)pFolder->GetInterface( IID_ILibraryFolder, TRUE ) : NULL;
return S_OK;
}
STDMETHODIMP CLibraryFolder::XLibraryFolders::get_Count(LONG FAR* pnCount)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFolders )
*pnCount = pThis->GetFolderCount();
return S_OK;
}
//////////////////////////////////////////////////////////////////////
// CLibraryFolder ILibraryFiles
IMPLEMENT_DISPATCH(CLibraryFolder, LibraryFiles)
STDMETHODIMP CLibraryFolder::XLibraryFiles::get_Application(IApplication FAR* FAR* ppApplication)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFiles )
*ppApplication = Application.GetApp();
return S_OK;
}
STDMETHODIMP CLibraryFolder::XLibraryFiles::get_Library(ILibrary FAR* FAR* ppLibrary)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFiles )
*ppLibrary = (ILibrary*)Library.GetInterface( IID_ILibrary, TRUE );
return S_OK;
}
STDMETHODIMP CLibraryFolder::XLibraryFiles::get__NewEnum(IUnknown FAR* FAR* ppEnum)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFiles )
return E_NOTIMPL;
}
STDMETHODIMP CLibraryFolder::XLibraryFiles::get_Item(VARIANT vIndex, ILibraryFile FAR* FAR* ppFile)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFiles )
CLibraryFile* pFile = NULL;
*ppFile = NULL;
if ( vIndex.vt == VT_BSTR )
{
CString strName( vIndex.bstrVal );
pFile = pThis->GetFile( 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 CLibraryFolder::XLibraryFiles::get_Count(LONG FAR* pnCount)
{
METHOD_PROLOGUE( CLibraryFolder, LibraryFiles )
*pnCount = pThis->GetFileCount();
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -