Fixed fill of the shared files when removing a directory from share.

git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@6999 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
thunder2 2014-01-08 16:19:56 +00:00
parent dacec52e4f
commit 8ef40bd944
2 changed files with 69 additions and 58 deletions

View File

@ -906,7 +906,6 @@ void FileIndexMonitor::updateCycle()
} }
if (cleanedCount > 0) { if (cleanedCount > 0) {
// cb->notifyListPreChange(NOTIFY_LIST_DIRLIST_LOCAL, 0);
RsServer::notify()->notifyListChange(NOTIFY_LIST_DIRLIST_LOCAL, 0); RsServer::notify()->notifyListChange(NOTIFY_LIST_DIRLIST_LOCAL, 0);
} }
} }
@ -1437,76 +1436,88 @@ bool FileIndexMonitor::inDirectoryCheck()
bool FileIndexMonitor::internal_setSharedDirectories() bool FileIndexMonitor::internal_setSharedDirectories()
{ {
int i; int i;
RsStackMutex stack(fiMutex) ; /* LOCKED DIRS */ bool changed = false;
if (!pendingDirs)
{ {
if (mForceCheck) RsStackMutex stack(fiMutex) ; /* LOCKED DIRS */
if (!pendingDirs)
{ {
mForceCheck = false; if (mForceCheck)
return true;
}
return false;
}
mForceCheck = false;
pendingDirs = false;
pendingForceCacheWrite = true;
/* clear old directories */
directoryMap.clear();
/* iterate through the directories */
std::list<SharedDirInfo>::iterator it;
std::map<std::string, SharedDirInfo>::const_iterator cit;
for(it = pendingDirList.begin(); it != pendingDirList.end(); it++)
{
/* get the head directory */
std::string root_dir = (*it).filename;
std::string top_dir = it->virtualname;
if (top_dir.empty()) {
top_dir = RsDirUtil::getTopDir(root_dir);
}
/* if unique -> add, else add modifier */
bool unique = false;
for(i = 0; !unique; i++)
{
std::string tst_dir = top_dir;
if (i > 0)
{ {
rs_sprintf_append(tst_dir, "-%d", i); mForceCheck = false;
return true;
} }
if (directoryMap.end()== (cit=directoryMap.find(tst_dir)))
return false;
}
mForceCheck = false;
pendingDirs = false;
pendingForceCacheWrite = true;
/* clear old directories */
directoryMap.clear();
/* iterate through the directories */
std::list<SharedDirInfo>::iterator it;
std::map<std::string, SharedDirInfo>::const_iterator cit;
for(it = pendingDirList.begin(); it != pendingDirList.end(); it++)
{
/* get the head directory */
std::string root_dir = (*it).filename;
std::string top_dir = it->virtualname;
if (top_dir.empty()) {
top_dir = RsDirUtil::getTopDir(root_dir);
}
/* if unique -> add, else add modifier */
bool unique = false;
for(i = 0; !unique; i++)
{ {
unique = true; std::string tst_dir = top_dir;
/* store calculated name */ if (i > 0)
it->virtualname = tst_dir; {
/* add it! */ rs_sprintf_append(tst_dir, "-%d", i);
directoryMap[tst_dir.c_str()] = *it; }
if (directoryMap.end()== (cit=directoryMap.find(tst_dir)))
{
unique = true;
/* store calculated name */
it->virtualname = tst_dir;
/* add it! */
directoryMap[tst_dir.c_str()] = *it;
#ifdef FIM_DEBUG #ifdef FIM_DEBUG
std::cerr << "Added [" << tst_dir << "] => " << root_dir << std::endl; std::cerr << "Added [" << tst_dir << "] => " << root_dir << std::endl;
#endif #endif
}
} }
} }
pendingDirList.clear();
/* now we've decided on the 'root' dirs set them to the
* fileIndex
*/
std::list<std::string> topdirs;
for(cit = directoryMap.begin(); cit != directoryMap.end(); cit++)
{
topdirs.push_back(cit->first);
}
if (fi.setRootDirectories(topdirs, 0) > 0)
{
changed = true;
}
locked_saveFileIndexes(true) ;
} }
pendingDirList.clear(); if (changed)
/* now we've decided on the 'root' dirs set them to the
* fileIndex
*/
std::list<std::string> topdirs;
for(cit = directoryMap.begin(); cit != directoryMap.end(); cit++)
{ {
topdirs.push_back(cit->first); RsServer::notify()->notifyListChange(NOTIFY_LIST_DIRLIST_LOCAL, 0);
} }
fi.setRootDirectories(topdirs, 0);
locked_saveFileIndexes(true) ;
return true; return true;
} }

View File

@ -557,7 +557,7 @@ int FileIndex::setRootDirectories(const std::list<std::string> &inlist, time_t u
} }
/* remove all dirs with zero time (non recursive) */ /* remove all dirs with zero time (non recursive) */
root->removeOldEntries(utime, false); int cleanedCount = root->removeOldEntries(utime, false);
/* now flag remaining directories with correct update time */ /* now flag remaining directories with correct update time */
for(it = root->subdirs.begin(); it != root->subdirs.end(); it++) for(it = root->subdirs.begin(); it != root->subdirs.end(); it++)
@ -569,7 +569,7 @@ int FileIndex::setRootDirectories(const std::list<std::string> &inlist, time_t u
updateHashIndex() ; updateHashIndex() ;
return 1; return cleanedCount;
} }
void FileIndex::updateHashIndex() void FileIndex::updateHashIndex()