Exemple #1
0
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;
}