summaryrefslogtreecommitdiff
path: root/src/xmlmenu.cpp
diff options
context:
space:
mode:
authorsvntcreutz <svntcreutz@cd0d6b48-d4f9-0310-940f-ab8c4eb44d3f>2007-07-27 00:15:22 +0000
committersvntcreutz <svntcreutz@cd0d6b48-d4f9-0310-940f-ab8c4eb44d3f>2007-07-27 00:15:22 +0000
commitea5503c121b54a050649a992e42a38381a38ff59 (patch)
treefe0a799e34cbdfc49cc02cb9b8d97d1865020390 /src/xmlmenu.cpp
parent2f31c080593497987c6bdab15d2e8018c02f5c50 (diff)
downloadvdr-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.cpp231
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