/* 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 #include "XMLExportEngine.hpp" static XMLExportEngine xmlExportEngine; XMLExportEngine::XMLExportEngine() { KissCount::RegisterExportEngine(this); _shortExt = "xml"; _longExt = _("KissCount XML files (*.xml)|*.xml"); } XMLExportEngine::~XMLExportEngine() { } bool XMLExportEngine::HandleFile(const QString& path, User* user, Database* db, KissCount* kiss) { return ExportEngine::HandleFile(path, user, db, kiss); } bool XMLExportEngine::SaveAccounts() { Account account; std::map::iterator it; for(it=_accounts.begin(); it!=_accounts.end(); it++) { account = _user->GetAccount(it->first); ESCAPE_CHARS(account.name); ESCAPE_CHARS(account.number); xmlTextWriterStartElement(_writer, (const xmlChar*) "account"); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "id", (const xmlChar*) QString::number(account.id).toStdString().c_str()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "name", (const xmlChar*) account.name.toStdString().c_str()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "number", (const xmlChar*) account.number.toStdString().c_str()); // xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "shared", (const xmlChar*) (account.shared ? "1" : "0")); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "blocked", (const xmlChar*) (account.blocked ? "1" : "0")); // xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "default", (const xmlChar*) (account._default ? "1" : "0")); // xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "is_owner", (const xmlChar*) (account.is_owner ? "1" : "0")); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "virtual", (const xmlChar*) (account._virtual ? "1" : "0")); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "hidden", (const xmlChar*) (account.hidden ? "1" : "0")); xmlTextWriterEndElement(_writer); } return true; } bool XMLExportEngine::SaveAccountAmounts() { std::map::iterator it; for(it=_accountAmounts.begin(); it!=_accountAmounts.end(); it++) { xmlTextWriterStartElement(_writer, (const xmlChar*) "account_amount"); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "account", (const xmlChar*) QString::number(it->first.account).toStdString().c_str()); xmlTextWriterWriteFormatAttribute(_writer, (const xmlChar*) "month", "%d", it->first.month); xmlTextWriterWriteFormatAttribute(_writer, (const xmlChar*) "year", "%d", it->first.year); xmlTextWriterWriteFormatAttribute(_writer, (const xmlChar*) "amount", "%.2lf", it->second); xmlTextWriterEndElement(_writer); } return true; } bool XMLExportEngine::SaveCategories() { Category category; std::map::iterator it; int rgb; for(it=_categories.begin(); it!=_categories.end(); it++) { category = _user->GetCategory(it->first); ESCAPE_CHARS(category.name); xmlTextWriterStartElement(_writer, (const xmlChar*) "category"); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "id", (const xmlChar*) QString::number(category.id).toStdString().c_str()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "parent", (const xmlChar*) QString::number(category.parent).toStdString().c_str()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "name", (const xmlChar*) category.name.toStdString().c_str()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "font", (const xmlChar*) category.font.toStdString().c_str()); rgb = category.backcolor.blue(); rgb |= category.backcolor.green() << 8; rgb |= category.backcolor.red() << 16; xmlTextWriterWriteFormatAttribute(_writer, (const xmlChar*) "backcolor", "0x%08X", rgb); rgb = category.forecolor.blue(); rgb |= category.forecolor.green() << 8; rgb |= category.forecolor.red() << 16; xmlTextWriterWriteFormatAttribute(_writer, (const xmlChar*) "forecolor", "0x%08X", rgb); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "fix_cost", (const xmlChar*) (category.fix_cost ? "1" : "0")); xmlTextWriterEndElement(_writer); } return true; } bool XMLExportEngine::SaveOperations(std::vector* operations) { std::vector::iterator it; for(it=operations->begin(); it!=operations->end(); it++) { ESCAPE_CHARS(it->description); xmlTextWriterStartElement(_writer, (const xmlChar*) "operation"); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "id", (const xmlChar*) QString::number(it->id).toStdString().c_str()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "parent", (const xmlChar*) QString::number(it->parent).toStdString().c_str()); xmlTextWriterWriteFormatAttribute(_writer, (const xmlChar*) "day", "%d", it->day); xmlTextWriterWriteFormatAttribute(_writer, (const xmlChar*) "month", "%d", it->month); xmlTextWriterWriteFormatAttribute(_writer, (const xmlChar*) "year", "%d", it->year); xmlTextWriterWriteFormatAttribute(_writer, (const xmlChar*) "amount", "%.2lf", it->amount); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "description", (const xmlChar*) it->description.toStdString().c_str()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "category", (const xmlChar*) QString::number(it->category).toStdString().c_str()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "fix_cost", (const xmlChar*) (it->fix_cost ? "1" : "0")); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "account", (const xmlChar*) QString::number(it->account).toStdString().c_str()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "checked", (const xmlChar*) (it->checked ? "1" : "0")); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "transfert", (const xmlChar*) QString::number(it->transfert).toStdString().c_str()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "formula", (const xmlChar*) it->formula.toStdString().c_str()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "meta", (const xmlChar*) (it->meta ? "1" : "0")); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "virtual", (const xmlChar*) (it->_virtual ? "1" : "0")); xmlTextWriterEndElement(_writer); } return true; } bool XMLExportEngine::SaveFile(std::vector* operations) { int rc; rc = ExportEngine::SaveFile(operations); if (!rc) return false; _writer = xmlNewTextWriterFilename(_path.toStdString().c_str(), 0); if (!_writer) { std::cout << "Error can't open the file" << std::endl; return false; } rc = xmlTextWriterStartDocument(_writer, 0, "UTF-8", 0); if (rc < 0) return false; xmlTextWriterStartElement(_writer, (const xmlChar*) "kisscount"); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "version", (const xmlChar*) "1"); SaveAccounts(); SaveAccountAmounts(); SaveCategories(); SaveOperations(operations); xmlTextWriterEndElement(_writer); xmlTextWriterEndDocument(_writer); xmlFreeTextWriter(_writer); return true; }