bool KviSharedFilesManager::removeSharedFile(const QString &szName,KviSharedFile * off) { KviSharedFileList * l = m_pSharedListDict->find(szName); if(!l)return false; for(KviSharedFile * o = l->first();o;o = l->next()) { if(off == o) { QString save = szName; // <-- szName MAY Be a pointer to o->name() l->removeRef(o); if(l->count() == 0)m_pSharedListDict->remove(save); emit sharedFileRemoved(off); return true; } } return false; }
void KviSharedFilesManager::cleanup() { KviPointerHashTableIterator<QString, KviSharedFileList> it(*m_pSharedListDict); time_t curTime = time(nullptr); bool bOtherStuffToCleanup = false; KviPointerList<QString> lDying; lDying.setAutoDelete(true); while(KviSharedFileList * l = it.current()) { KviPointerList<KviSharedFile> tmp; tmp.setAutoDelete(false); for(KviSharedFile * o = l->first(); o; o = l->next()) { if(o->expireTime() > 0) { if(((int)o->expireTime()) <= ((int)curTime)) { tmp.append(o); } else { bOtherStuffToCleanup = true; } } } for(KviSharedFile * fo = tmp.first(); fo; fo = tmp.next()) { l->removeRef(fo); emit sharedFileRemoved(fo); } if(l->count() == 0) lDying.append(new QString(it.currentKey())); ++it; } for(QString * pDyingKey = lDying.first(); pDyingKey; pDyingKey = lDying.next()) m_pSharedListDict->remove(*pDyingKey); if(!bOtherStuffToCleanup) m_pCleanupTimer->stop(); }
bool KviSharedFilesManager::removeSharedFile(const QString &szName,const QString &szMask,unsigned int uFileSize) { KviSharedFileList * l = m_pSharedListDict->find(szName); if(!l)return false; for(KviSharedFile * o = l->first();o;o = l->next()) { if(KviQString::equalCI(szMask,o->userMask())) { bool bMatch = uFileSize > 0 ? uFileSize == o->fileSize() : true; if(bMatch) { QString save = szName; // <-- szName MAY Be a pointer to o->name() l->removeRef(o); if(l->count() == 0)m_pSharedListDict->remove(save); emit sharedFileRemoved(o); return true; } } } return false; }