/* Copyright 2010-2011 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 "XMLExportEngine.h" static XMLExportEngine xmlExportEngine; XMLExportEngine::XMLExportEngine() { KissCount::RegisterExportEngine(this); _shortExt = wxT("xml"); _longExt = _("XML files (*.xml)|*.xml"); } XMLExportEngine::~XMLExportEngine() { } bool XMLExportEngine::HandleFile(const wxString& 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*) account.id.utf8_str().data()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "name", (const xmlChar*) account.name.utf8_str().data()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "number", (const xmlChar*) account.number.utf8_str().data()); // 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")); 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*) it->first.account.utf8_str().data()); 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*) category.id.utf8_str().data()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "name", (const xmlChar*) category.name.utf8_str().data()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "font", (const xmlChar*) category.font.utf8_str().data()); 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*) it->id.utf8_str().data()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "parent", (const xmlChar*) it->parent.utf8_str().data()); 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.utf8_str().data()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "category", (const xmlChar*) it->category.utf8_str().data()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "fix_cost", (const xmlChar*) (it->fix_cost ? "1" : "0")); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "account", (const xmlChar*) it->account.utf8_str().data()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "checked", (const xmlChar*) (it->checked ? "1" : "0")); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "transfert", (const xmlChar*) it->transfert.utf8_str().data()); xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "formula", (const xmlChar*) it->formula.utf8_str().data()); 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.mb_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; }