/*
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;
}