void FileModel::readDirectory() { // wrapped in reset model methods to get views notified beginResetModel(); m_files.clear(); m_errorMessage = ""; if (!m_dir.isEmpty()) readAllEntries(); endResetModel(); emit fileCountChanged(); emit errorMessageChanged(); recountSelectedFiles(); }
PwDatabaseV3::ErrorCode PwDatabaseV3::readContent(QDataStream& stream) { setPhaseProgressRawTarget(header.getGroupCount() + header.getEntryCount()); QList<PwGroupV3*> groups; ErrorCode err = readAllGroups(stream, groups); if (err != SUCCESS) return err; QList<PwEntryV3*> entries; err = readAllEntries(stream, entries); if (err != SUCCESS) return err; // make a group-by-ID lookup hashtable; // also find the maximum group level int maxLevel = 0; quint16 level; PwGroupV3* group; QHash<qint32, PwGroupV3*> groupById; for (int i = 0; i < groups.size(); i++) { group = groups.at(i); groupById.insert(group->getId(), group); level = group->getLevel(); if (level > maxLevel) maxLevel = level; } // restore group hierarchy PwGroupV3* rootGroupV3 = new PwGroupV3(); rootGroupV3->setDatabase(this); rootGroupV3->setLevel(-1); // because its children should have level 0 rootGroupV3->setIconId(PwGroup::DEFAULT_ICON_ID); // created subgroups will use this icon // give the "virtual" root group some meaningful name rootGroupV3->setName(getDatabaseFileName()); _rootGroup = rootGroupV3; PwGroupV3* parentGroup = (PwGroupV3*)_rootGroup; for (quint16 level = 0; level <= maxLevel; level++) { quint16 prevLevel = level - 1; for (int i = 0; i < groups.size(); i++) { PwGroupV3* group = groups.at(i); quint16 curLevel = group->getLevel(); if (curLevel == level) { parentGroup->addSubGroup(group); } else if (curLevel == prevLevel) { parentGroup = group; } } } // put entries to their groups PwEntryV3* entry; for (int i = 0; i < entries.size(); i++) { entry = entries.at(i); if (entry->isMetaStream()) { // meta streams are kept in their own list, invisibly for the user metaStreamEntries.append(entry); } else { qint32 groupId = entry->getGroupId(); if (!groupById.contains(groupId)) { LOG("There is an entry %s with unknown groupId: %d", entry->toString().toUtf8().constData(), groupId); return ORPHANED_ENTRY_ERROR; } PwGroupV3* group = groupById.value(groupId); entry->setDeleted(group->isDeleted()); group->addEntry(entry); } } return SUCCESS; }
bool OleStorage::init(shared_ptr<ZLInputStream> stream, size_t streamSize) { clear(); myInputStream = stream; myStreamSize = streamSize; myInputStream->seek(0, true); char oleBuf[BBD_BLOCK_SIZE]; size_t ret = myInputStream->read(oleBuf, BBD_BLOCK_SIZE); if (ret != BBD_BLOCK_SIZE) { clear(); return false; } static const char OLE_SIGN[] = {0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1, 0}; if (strncmp(oleBuf, OLE_SIGN, 8) != 0) { clear(); return false; } mySectorSize = 1 << OleUtil::getU2Bytes(oleBuf, 0x1e); //offset for value of big sector size myShortSectorSize = 1 << OleUtil::getU2Bytes(oleBuf, 0x20); //offset for value of small sector size if (readDIFAT(oleBuf) && readBBD(oleBuf) && readSBD(oleBuf) && readProperties(oleBuf) && readAllEntries()) { return true; } clear(); return false; }