diff options
author | svntcreutz <svntcreutz@cd0d6b48-d4f9-0310-940f-ab8c4eb44d3f> | 2007-07-27 00:15:22 +0000 |
---|---|---|
committer | svntcreutz <svntcreutz@cd0d6b48-d4f9-0310-940f-ab8c4eb44d3f> | 2007-07-27 00:15:22 +0000 |
commit | ea5503c121b54a050649a992e42a38381a38ff59 (patch) | |
tree | fe0a799e34cbdfc49cc02cb9b8d97d1865020390 /src/xmlmenu.cpp | |
parent | 2f31c080593497987c6bdab15d2e8018c02f5c50 (diff) | |
download | vdr-plugin-menuorg-ea5503c121b54a050649a992e42a38381a38ff59.tar.gz vdr-plugin-menuorg-ea5503c121b54a050649a992e42a38381a38ff59.tar.bz2 |
xmlmenu.[h,cpp] created and the first parts hacked
git-svn-id: file:///home/tobias/sandbox/vdr/--/vdr-pkg/vdr-pkg/submenu/trunk@5646 cd0d6b48-d4f9-0310-940f-ab8c4eb44d3f
Diffstat (limited to 'src/xmlmenu.cpp')
-rw-r--r-- | src/xmlmenu.cpp | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/src/xmlmenu.cpp b/src/xmlmenu.cpp new file mode 100644 index 0000000..2bba503 --- /dev/null +++ b/src/xmlmenu.cpp @@ -0,0 +1,231 @@ +#include <libxml++/libxml++.h> +#include <iostream> + +//#include <vdr/submenupatch.h> +using namespace xmlpp; +using namespace std; + +XmlMenu::XmlMenu(void) +{ + //MenuNr = 0; +} + +void XmlMenu::loadXmlMenu() +{ + // TODO: show how vdr handels the path vars (developer doc) + // and change code for dynamic path vars + const char *File = "/var/lib/vdr/plugins/vdr-menu.xml"; + + try + { + DomParser parser; + + //TODO: patch the xmlfile with the xsd definition for validate + //parser.set_validate(); + parser.set_substitute_entities(); //We just want the text to be resolved/unescaped automatically. + parser.parse_file(File); + if(parser) + { + //Walk the tree: + const Node* pNode = parser.get_document()->get_root_node(); //deleted by DomParser. + parseNode(pNode,0); + } + } + catch(const std::exception& ex) + { + //TODO: print output to syslog (isyslog or dsyslog?) + cout << "Exception caught: " << ex.what() << endl; + + //TODO: display message on osd + } +} + +void XmlMenu::parseNode(const Node* a_node, unsigned int Parent, MenuNode *parentNode) +{ + const ContentNode* nodeContent = dynamic_cast<const ContentNode*>(a_node); + const TextNode* nodeText = dynamic_cast<const TextNode*>(a_node); + const CommentNode* nodeComment = dynamic_cast<const CommentNode*>(a_node); + +/**** + MenuNode* subMenu1 =_rootMenuNode.AddChild(new SubMenuItem("Custom menu 1")); + subMenu1->AddChild(new VdrMenuItem(tr("Schedule"), osSchedule)); + subMenu1->AddChild(new VdrMenuItem(tr("Channels"), osChannels)); + MenuNode* subMenu1_1 = subMenu1->AddChild(new SubMenuItem("Custom menu 1.1")); + subMenu1_1->AddChild(new VdrMenuItem(tr("Timers"), osTimers)); + subMenu1_1->AddChild(new VdrMenuItem(tr("Recordings"), osRecordings)); + MenuNode* subMenu2 =_rootMenuNode.AddChild(new SubMenuItem("Custom menu 2")); + subMenu2->AddChild(new PluginMenuItem(item, i)); +****/ + + Glib::ustring nodename = a_node->get_name(); + + if(!nodeText && !nodeComment && !nodename.empty()) //Let's not say "name: text". + { + for(int i=0;i<=Parent;i++) + { + printf(" "); + } + if (nodename == "menus") + { + //cout << Parent << "-" << MainMenuIndex << "-" << myMenuNr << "-ROOT" << endl; + + } + else if (nodename == "system") + { + if (const Element* nodeElement = dynamic_cast<const Element*>(a_node)) + { + const Element::AttributeList& attributes = nodeElement->get_attributes(); + for(xmlpp::Element::AttributeList::const_iterator iter = attributes.begin(); iter != attributes.end(); ++iter) + { + const Attribute* attribute = *iter; + //cout << Parent << "-" << MainMenuIndex << "-" << myMenuNr << "-SystemItem=" << attribute->get_value() << endl; + if (parentNode == NULL) + newparentNode =_rootMenuNode.AddChild(new VdrMenuItem(tr(attribute->get_value()), geteOSState(attribute->get_value()))); + else + newparentNode = parentNode->AddChild(new VdrMenuItem(tr(attribute->get_value()), geteOSState(attribute->get_value()))); + } + } + } + else if (nodename == "menu") + { + if (const Element* nodeElement = dynamic_cast<const Element*>(a_node)) + { + const Element::AttributeList& attributes = nodeElement->get_attributes(); + for(xmlpp::Element::AttributeList::const_iterator iter = attributes.begin(); iter != attributes.end(); ++iter) + { + const Attribute* attribute = *iter; + //cout << Parent << "-" << MainMenuIndex << "-" << myMenuNr << "-MenuItem=" << attribute->get_value() << endl; + if (parentNode == NULL) + newparentNode =_rootMenuNode.AddChild(new SubMenuItem(attribute->get_value())); + else + newparentNode = parentNode->AddChild(new SubMenuItem(attribute->get_value())); + } + } + } + else if (nodename == "plugin") + { + if (const Element* nodeElement = dynamic_cast<const Element*>(a_node)) + { + const Element::AttributeList& attributes = nodeElement->get_attributes(); + for(xmlpp::Element::AttributeList::const_iterator iter = attributes.begin(); iter != attributes.end(); ++iter) + { + const Attribute* attribute = *iter; + //cout << Parent << "-" << MainMenuIndex << "-" << myMenuNr << "-PluginItem=" << attribute->get_value() << endl; + if (getPluginIndex(attribute->get_value()) != NULL) + { + if (parentNode == NULL) + newparentNode =_rootMenuNode.AddChild(new PluginMenuItem(item, getPluginIndex(attribute->get_value()))); + else + newparentNode = parentNode->AddChild(new PluginMenuItem(item, getPluginIndex(attribute->get_value()))); + } + } + } + } + } + if(!nodeContent) + { + //Recurse through child nodes: + Node::NodeList list = a_node->get_children(); + for(Node::NodeList::iterator iter = list.begin(); iter != list.end(); ++iter) + { + parseNode(*iter, Parent+1, newparentNode); //recursive + } + } +} +/* +enum eOSState { osUnknown, + osContinue, + osSchedule, + osChannels, + osTimers, + osRecordings, + osPlugin, + osSetup, + osCommands, + osPause, + osRecord, + osReplay, + osStopRecord, + osStopReplay, + osCancelEdit, + osSwitchDvb, + osBack, + osEnd, + os_User, // the following values can be used locally + osUser1, + osUser2, + osUser3, + osUser4, + osUser5, + osUser6, + osUser7, + osUser8, + osUser9, + osUser10, + }; +*/ +eOSState XmlMenu::geteOSState(char* name) +{ + if(name == "Continue") + { + return osContinue; + } + else if (name == "Schedule") + { + return osSchedule; + } + else if (name == "Channels") + { + return osChannels; + } + else if (name == "Timers") + { + return osTimers; + } + else if (name == "Recordings") + { + return osRecordings; + } + else if (name == "Plugin") + { + return osPlugin; + } + else if (name == "Setup") + { + return osSetup; + } + else if (name == "Pause") + { + return osPause; + } + else if (name == "Record") + { + return osRecord; + } + else if (name == "Replay") + { + return osReplay; + } + else if (name == "CancelEdit") + { + return osCancelEdit; + } + else if (name == "SwitchDvb") + { + return osSwitchDvb; + } + else if (name == "Back") + { + return osBack; + } + else if (name == "End") + { + return osEnd; + } + else if (name == "User") + { + return os_User; + } + else + return osContinue; +}
\ No newline at end of file |