00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <algorithm>
00024 #include <iostream>
00025 #include <sstream>
00026
00027 #include "xmldao.hpp"
00028 #include "kitparser.hpp"
00029
00030 using namespace std;
00031
00032
00046 KitModel* XmlDao::get_model() {
00047 KitModel* retval = new KitModel();
00048 try {
00049 if (m_filename.size() > 0) {
00050 KitParser parser(*retval);
00051 parser.set_validate();
00052 parser.set_substitute_entities();
00053 parser.parse_file(m_filename);
00054
00055 }
00056 ItemContainer* items = retval->get_all_items();
00057 ItemIter i = max_element(items->begin(), items->end(), ItemCompareId());
00058 if (i != items->end()) {
00059 Item* max_item = (*i);
00060 m_max_item_id = max_item->get_id();
00061 } else {
00062 m_max_item_id = -1;
00063 }
00064 delete items;
00065 CategoryContainer* categories = retval->get_categories();
00066 CategoryIter cat = std::max_element(categories->begin(), categories->end(), CategoryCompareId());
00067 if (cat != categories->end()) {
00068 Category* max_category = (*cat);
00069 m_max_category_id = max_category->get_id();
00070 } else {
00071 m_max_category_id = -1;
00072 }
00073 delete categories;
00074 retval->reset();
00075 } catch (const xmlpp::exception& ex) {
00076 std::cout << "libxml++ exception: " << ex.what() << std::endl;
00077 }
00078 return retval;
00079 }
00080
00081
00087 bool XmlDao::add_item_to_dom(ModelItem& item) {
00088 assert(m_items_node != NULL);
00089 if (!item.is_deleted()) {
00090 xmlpp::Element* itemNode = m_items_node->add_child("item");
00091 ostringstream os;
00092 os << item.get_id();
00093 itemNode->set_attribute("id", os.str());
00094 itemNode->set_attribute("checked", item.get_checked() ? "true" : "false");
00095 itemNode->set_child_text(item.get_description());
00096 }
00097 return false;
00098 }
00099
00100
00106 bool XmlDao::add_category_item_to_dom(Item& item) {
00107 assert(m_cat_items_node != NULL);
00108 if (!((ModelItem&) item).is_deleted()) {
00109 xmlpp::Element* itemNode = m_cat_items_node->add_child("category-item");
00110 ostringstream os;
00111 os << item.get_id();
00112 itemNode->set_attribute("id", os.str());
00113 }
00114 return false;
00115 }
00116
00117
00123 bool XmlDao::add_category_to_dom(ModelCategory& category) {
00124 assert(m_categories_node != NULL);
00125 if (!category.is_deleted()) {
00126 xmlpp::Element* catNode = m_categories_node->add_child("category");
00127 ostringstream os;
00128 os << category.get_id();
00129 catNode->set_attribute("id", os.str());
00130 xmlpp::Element* catNameNode = catNode->add_child("category-name");
00131 catNameNode->set_child_text(category.get_name());
00132 m_cat_items_node = catNode->add_child("category-items");
00133 category.foreach_item( sigc::mem_fun(*this, &XmlDao::add_category_item_to_dom) );
00134 }
00135 return false;
00136 }
00137
00138
00142 long XmlDao::get_next_item_id() {
00143 return ++m_max_item_id;
00144 }
00145
00146
00150 long XmlDao::get_next_category_id() {
00151 return ++m_max_category_id;
00152 }
00153
00154
00163 void XmlDao::save_model(KitModel* model) {
00164 xmlpp::Document document;
00165 xmlpp::Element* rootNode = document.create_root_node("kitlist");
00166 m_items_node = rootNode->add_child("items");
00167 model->foreach_item( sigc::mem_fun(*this, &XmlDao::add_item_to_dom) );
00168 m_categories_node = rootNode->add_child("categories");
00169 model->foreach_category( sigc::mem_fun(*this, &XmlDao::add_category_to_dom) );
00170 document.write_to_file_formatted(m_filename);
00171 #ifdef XML_DAO
00172
00173 model->purge();
00174
00175 model->reset();
00176 #endif
00177 }