/* Copyright 2010-2012 Grégory Soutadé This file is part of KissCount. KissCount is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. KissCount is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with KissCount. If not, see . */ #include #include #include "XMLImportEngine.hpp" static XMLImportEngine xmlImportEngine; XMLImportEngine::XMLImportEngine() { KissCount::RegisterImportEngine(this); _shortExt = ".xml"; _longExt = _("KissCount xml files (*.xml)"); _sax.setContentHandler(this); } XMLImportEngine::~XMLImportEngine() { } bool XMLImportEngine::HandleFile(const QString& path, User* user, Database* db, KissCount* kiss) { bool res = false; QFile file(path); if (!ImportEngine::HandleFile(path, user, db, kiss)) return false; if (!file.open(QIODevice::ReadOnly)) { std::cout << "Error can't open the file " << path.toStdString() << std::endl; return false; } try { res = _sax.parse(&file); LinkChilds(); } catch (const char* s) { std::cout << "XMLImportEngine :: " << s << std::endl; res = false; } file.close(); return res; } bool XMLImportEngine::startElement (const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& attrs) { if (qName == "kisscount") { if (attrs.value("version") != "1") throw "Unsupported version !"; } else if (qName == "account") LoadAccount(attrs); else if (qName == "account_amount") LoadAccountAmount(attrs); else if (qName == "category") LoadCategory(attrs); else if (qName == "operation") LoadOperation(attrs); else std::cout << "Unknown element : '" << qName.toStdString() << "'" << std::endl; return true; } void XMLImportEngine::LoadAccount(const QXmlAttributes& attrs) { int id; Account ac; static int unknownAccount = 0; ac.id = 0; ac.name = attrs.value("name"); ac.id = id = attrs.value("id").toInt(); ac.number = attrs.value("number"); ac.blocked = (attrs.value("blocked") == "1"); ac._virtual = (attrs.value("virtual") == "1"); ac.hidden = (attrs.value("hidden") == "1"); UNESCAPE_CHARS(ac.name); UNESCAPE_CHARS(ac.number); ac._default = false; ac.shared = false; ac.is_owner = true; if (ac.number.size()) { try { _accounts[ac.id] = _user->GetAccountIdFromAccountNumber(ac.number); return; } catch (User::AccountNotFound) { } } if (ac.name.size()) { try { _accounts[ac.id] = _user->GetAccountId(ac.name); return; } catch (User::AccountNotFound) { } } _accounts[id] = --unknownAccount; _unresolvedAccounts.push_back(ac); } void XMLImportEngine::LoadAccountAmount(const QXmlAttributes& attrs) { AccountAmount accountAmount; double amount; accountAmount.account = attrs.value("account").toInt(); accountAmount.month = attrs.value("month").toInt(); accountAmount.year = attrs.value("year").toInt(); amount = attrs.value("amount").toDouble(); _accountAmounts[accountAmount] = amount; } void XMLImportEngine::LoadCategory(const QXmlAttributes& attrs) { QString name; int id; long rgb; Category cat; static int unknownCategory = 0; cat.fix_cost = false; cat.name = name = attrs.value("name"); cat.id = id = attrs.value("id").toInt(); cat.parent = attrs.value("parent").toInt(); cat.font = attrs.value("font"); if (attrs.value("backcolor") != "") { rgb = attrs.value("backcolor").toInt(0, 16); cat.backcolor = QColor((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF); } else cat.backcolor = view::OWN_GREEN; if (attrs.value("forecolor") != "") { rgb = attrs.value("forecolor").toInt(0, 16); cat.forecolor = QColor((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF); } else cat.forecolor = Qt::black; cat.fix_cost = (attrs.value("fix_cost") == "1"); UNESCAPE_CHARS(cat.name); int catId = _user->GetCategoryId(name); if (catId) { _categories[id] = catId; return; } _categories[id] = --unknownCategory; _unresolvedCategories.push_back(cat); } void XMLImportEngine::LoadOperation(const QXmlAttributes& attrs) { Operation op; op.id = attrs.value("id").toInt(); op.parent = attrs.value("parent").toInt(); op.day = attrs.value("day").toInt(); op.month = attrs.value("month").toInt(); op.year = attrs.value("year").toInt(); op.amount = attrs.value("amount").toDouble(); op.description = attrs.value("description"); op.category = attrs.value("category").toInt(); op.category = (attrs.value("fix_cost") == "1"); op.account = attrs.value("account").toInt(); op.checked = (attrs.value("checked") == "1"); op.transfert = attrs.value("transfert").toInt(); op.formula = attrs.value("formula"); op.meta = (attrs.value("meta") == "1"); op._virtual = (attrs.value("virtual") == "1"); UNESCAPE_CHARS(op.description); _operations.push_back(op); _descriptions[op.id] = op.description; MatchPattern(op.description, op); }