bool CategoryAccount::readElement(QXmlStreamReader *xml, bool *valid) { if(xml->name() == "budget") { QXmlStreamAttributes attr = xml->attributes(); QDate date = QDate::fromString(attr.value("date").toString(), Qt::ISODate); mbudgets[date] = attr.value("value").toDouble(); return false; } else if(xml->name() == "category") { QStringRef ctype = xml->attributes().value("type"); bool valid2 = true; if(type() == ACCOUNT_TYPE_EXPENSES && ctype == "expenses") { ExpensesAccount *account = new ExpensesAccount(budget(), xml, &valid2); if(valid) { budget()->expensesAccounts_id[account->id()] = account; budget()->expensesAccounts.append(account); budget()->accounts.append(account); addSubCategory(account); } else { delete account; } return true; } else if(type() == ACCOUNT_TYPE_INCOMES && ctype == "incomes") { IncomesAccount *account = new IncomesAccount(budget(), xml, &valid2); if(valid) { budget()->incomesAccounts_id[account->id()] = account; budget()->incomesAccounts.append(account); budget()->accounts.append(account); addSubCategory(account); } else { delete account; } return true; } return false; } return Account::readElement(xml, valid); }
DatIndexReader::ReadResult DatIndexReader::read(uint p_amount) { ReadResult result = RR_Failure; for (uint i = 0; i < p_amount; i++) { ssize_t bytesRead; // First read all categories, one at a time if (m_index.numCategories() < m_header.numCategories) { // Read fixed-width fields DatIndexCategoryFields fields; bytesRead = m_file.Read(&fields, sizeof(fields)); if (bytesRead < sizeof(fields)) { result = RR_CorruptFile; goto READ_FAILED; } // Read name Array<char> nameData(fields.nameLength); bytesRead = m_file.Read(nameData.GetPointer(), nameData.GetSize()); if (bytesRead < (ssize_t)nameData.GetSize()) { result = RR_CorruptFile; goto READ_FAILED; } // Add category auto name = wxString::FromUTF8Unchecked(nameData.GetPointer(), nameData.GetSize()); auto category = m_index.addIndexCategory(name, false); // Set parent if (fields.parent != DatIndex_RootCategory) { auto parent = m_index.category(fields.parent); if (parent) { parent->addSubCategory(category); } } } // If all categories are read, start reading the files instead (note the 'else') else if (m_index.numEntries() < m_header.numEntries) { // Read fixed-width fields DatIndexEntryFields fields; bytesRead = m_file.Read(&fields, sizeof(fields)); if (bytesRead < sizeof(fields)) { result = RR_CorruptFile; goto READ_FAILED; } // Read name Array<char> nameData(fields.nameLength); bytesRead = m_file.Read(nameData.GetPointer(), nameData.GetSize()); if (bytesRead < (ssize_t)nameData.GetSize()) { result = RR_CorruptFile; goto READ_FAILED; } // Add entry auto name = wxString::FromUTF8Unchecked(nameData.GetPointer(), nameData.GetSize()); auto& newEntry = m_index.addIndexEntry(false) ->setBaseId(fields.baseId) .setFileId(fields.fileId) .setMftEntry(fields.mftEntry) .setFileType((ANetFileType)fields.fileType) .setName(name); auto category = m_index.category(fields.category); if (!category) { result = RR_CorruptFile; goto READ_FAILED; } category->addEntry(&newEntry); newEntry.finalizeAdd(); } // If both are done we can skip this loop else { break; } } return RR_Success; READ_FAILED: return result; }