BOOL CCachedDirectory::LoadFromDisk(FILE * pFile) { AutoLocker lock(m_critSec); #define LOADVALUEFROMFILE(x) if (fread(&x, sizeof(x), 1, pFile)!=1) return false; try { unsigned int value = 0; LOADVALUEFROMFILE(value); if (value != GIT_CACHE_VERSION) return false; // not the correct version int mapsize = 0; LOADVALUEFROMFILE(mapsize); for (int i=0; i<mapsize; ++i) { LOADVALUEFROMFILE(value); if (value > MAX_PATH) return false; if (value) { CString sKey; if (fread(sKey.GetBuffer(value+1), sizeof(TCHAR), value, pFile)!=value) { sKey.ReleaseBuffer(0); return false; } sKey.ReleaseBuffer(value); CStatusCacheEntry entry; if (!entry.LoadFromDisk(pFile)) return false; // only read non empty keys (just needed for transition from old TGit clients) if (!sKey.IsEmpty()) m_entryCache[sKey] = entry; } } LOADVALUEFROMFILE(mapsize); for (int i=0; i<mapsize; ++i) { LOADVALUEFROMFILE(value); if (value > MAX_PATH) return false; if (value) { CString sPath; if (fread(sPath.GetBuffer(value), sizeof(TCHAR), value, pFile)!=value) { sPath.ReleaseBuffer(0); return false; } sPath.ReleaseBuffer(value); git_wc_status_kind status; LOADVALUEFROMFILE(status); m_childDirectories[CTGitPath(sPath)] = status; } } LOADVALUEFROMFILE(value); if (value > MAX_PATH) return false; if (value) { CString sPath; if (fread(sPath.GetBuffer(value+1), sizeof(TCHAR), value, pFile)!=value) { sPath.ReleaseBuffer(0); return false; } sPath.ReleaseBuffer(value); // make sure paths do not end with backslash (just needed for transition from old TGit clients) if (sPath.GetLength() > 3 && sPath[sPath.GetLength() - 1] == _T('\\')) sPath.TrimRight(_T("\\")); m_directoryPath.SetFromWin(sPath); m_directoryPath.GetGitPathString(); // make sure git path string is set } if (!m_ownStatus.LoadFromDisk(pFile)) return false; LOADVALUEFROMFILE(m_currentFullStatus); LOADVALUEFROMFILE(m_mostImportantFileStatus); } catch ( CAtlException ) { return false; } return true; }
BOOL CCachedDirectory::LoadFromDisk(FILE * pFile) { AutoLocker lock(m_critSec); #define LOADVALUEFROMFILE(x) if (fread(&x, sizeof(x), 1, pFile)!=1) return false; try { unsigned int value = 0; LOADVALUEFROMFILE(value); if (value != CACHEDIRECTORYDISKVERSION) return false; // not the correct version int mapsize = 0; LOADVALUEFROMFILE(mapsize); for (int i=0; i<mapsize; ++i) { LOADVALUEFROMFILE(value); if (value > MAX_PATH) return false; if (value) { CStringA sKey; if (fread(sKey.GetBuffer(value+1), sizeof(char), value, pFile)!=value) { sKey.ReleaseBuffer(0); return false; } sKey.ReleaseBuffer(value); CStatusCacheEntry entry; if (!entry.LoadFromDisk(pFile)) return false; m_entryCache[sKey] = entry; } } LOADVALUEFROMFILE(mapsize); for (int i=0; i<mapsize; ++i) { LOADVALUEFROMFILE(value); if (value > MAX_PATH) return false; if (value) { CStringA sPath; if (fread(sPath.GetBuffer(value), sizeof(char), value, pFile)!=value) { sPath.ReleaseBuffer(0); return false; } sPath.ReleaseBuffer(value); svn_wc_status_kind status; LOADVALUEFROMFILE(status); m_childDirectories[sPath] = status; } } LOADVALUEFROMFILE(m_wcDbFileTime); LOADVALUEFROMFILE(value); if (value > MAX_PATH) return false; if (value) { CString sPath; if (fread(sPath.GetBuffer(value+1), sizeof(TCHAR), value, pFile)!=value) { sPath.ReleaseBuffer(0); return false; } sPath.ReleaseBuffer(value); m_directoryPath.SetFromWin(sPath); } if (!m_ownStatus.LoadFromDisk(pFile)) return false; LOADVALUEFROMFILE(m_currentFullStatus); LOADVALUEFROMFILE(m_mostImportantFileStatus); } catch ( CAtlException ) { return false; } return true; }