bool CDirectoryCache::FileExists(const CStdString& strFile, bool& bInCache) { CSingleLock lock (m_cs); bInCache = false; CStdString strPath; URIUtils::GetDirectory(strFile, strPath); URIUtils::RemoveSlashAtEnd(strPath); ciCache i = m_cache.find(strPath); if (i != m_cache.end()) { bInCache = true; CDir *dir = i->second; dir->SetLastAccess(m_accessCounter); #ifdef _DEBUG m_cacheHits++; #endif return dir->m_Items->Contains(strFile); } #ifdef _DEBUG m_cacheMisses++; #endif return false; }
void CDirectoryCache::SetDirectory(const CStdString& strPath, const CFileItemList &items, DIR_CACHE_TYPE cacheType) { if (cacheType == DIR_CACHE_NEVER) return; // nothing to do // caches the given directory using a copy of the items, rather than the items // themselves. The reason we do this is because there is often some further // processing on the items (stacking, transparent rars/zips for instance) that // alters the URL of the items. If we shared the pointers, we'd have problems // as the URLs in the cache would have changed, so things such as // CDirectoryCache::FileExists() would fail for files that really do exist (just their // URL's have been altered). This is called from CFile::Exists() which causes // all sorts of hassles. // IDEALLY, any further processing on the item would actually create a new item // instead of altering it, but we can't really enforce that in an easy way, so // this is the best solution for now. CSingleLock lock (m_cs); CStdString storedPath = URIUtils::SubstitutePath(strPath); URIUtils::RemoveSlashAtEnd(storedPath); ClearDirectory(storedPath); CheckIfFull(); CDir* dir = new CDir(cacheType); dir->m_Items->Copy(items); dir->SetLastAccess(m_accessCounter); m_cache.insert(pair<CStdString, CDir*>(storedPath, dir)); }
bool CDirectoryCache::GetDirectory(const std::string& strPath, CFileItemList &items, bool retrieveAll) { CSingleLock lock (m_cs); // Get rid of any URL options, else the compare may be wrong std::string storedPath = CURL(strPath).GetWithoutOptions(); URIUtils::RemoveSlashAtEnd(storedPath); ciCache i = m_cache.find(storedPath); if (i != m_cache.end()) { CDir* dir = i->second; if (dir->m_cacheType == XFILE::DIR_CACHE_ALWAYS || (dir->m_cacheType == XFILE::DIR_CACHE_ONCE && retrieveAll)) { items.Copy(*dir->m_Items); dir->SetLastAccess(m_accessCounter); #ifdef _DEBUG m_cacheHits+=items.Size(); #endif return true; } } return false; }
bool CDirectoryCache::FileExists(const std::string& strFile, bool& bInCache) { CSingleLock lock (m_cs); bInCache = false; // Get rid of any URL options, else the compare may be wrong std::string strPath = CURL(strFile).GetWithoutOptions(); URIUtils::RemoveSlashAtEnd(strPath); std::string storedPath = URIUtils::GetDirectory(strPath); URIUtils::RemoveSlashAtEnd(storedPath); ciCache i = m_cache.find(storedPath); if (i != m_cache.end()) { bInCache = true; CDir *dir = i->second; dir->SetLastAccess(m_accessCounter); #ifdef _DEBUG m_cacheHits++; #endif return (URIUtils::PathEquals(strPath, storedPath) || dir->m_Items->Contains(strFile)); } #ifdef _DEBUG m_cacheMisses++; #endif return false; }
void CDirectoryCache::AddFile(const std::string& strFile) { CSingleLock lock (m_cs); std::string strPath = URIUtils::GetDirectory(strFile); URIUtils::RemoveSlashAtEnd(strPath); ciCache i = m_cache.find(strPath); if (i != m_cache.end()) { CDir *dir = i->second; CFileItemPtr item(new CFileItem(strFile, false)); dir->m_Items->Add(item); dir->SetLastAccess(m_accessCounter); } }
void CDirectoryCache::AddFile(const std::string& strFile) { CSingleLock lock (m_cs); // Get rid of any URL options, else the compare may be wrong std::string strPath = URIUtils::GetDirectory(CURL(strFile).GetWithoutOptions()); URIUtils::RemoveSlashAtEnd(strPath); ciCache i = m_cache.find(strPath); if (i != m_cache.end()) { CDir *dir = i->second; CFileItemPtr item(new CFileItem(strFile, false)); dir->m_Items->Add(item); dir->SetLastAccess(m_accessCounter); } }
bool CDirectoryCache::GetDirectory(const CStdString& strPath, CFileItemList &items, bool retrieveAll) { CSingleLock lock (m_cs); CStdString storedPath = URIUtils::SubstitutePath(strPath); URIUtils::RemoveSlashAtEnd(storedPath); ciCache i = m_cache.find(storedPath); if (i != m_cache.end()) { CDir* dir = i->second; if (dir->m_cacheType == XFILE::DIR_CACHE_ALWAYS || (dir->m_cacheType == XFILE::DIR_CACHE_ONCE && retrieveAll)) { items.Copy(*dir->m_Items); dir->SetLastAccess(m_accessCounter); #ifdef _DEBUG m_cacheHits+=items.Size(); #endif return true; } } return false; }