diff --git a/sflphone-common/src/config/config.cpp b/sflphone-common/src/config/config.cpp index 74169b7547a7b60a648d74fef8bf7167bb2b6677..0c937b6f94693eac2c963f5ebf674a921ee149c2 100755 --- a/sflphone-common/src/config/config.cpp +++ b/sflphone-common/src/config/config.cpp @@ -46,7 +46,7 @@ namespace Conf // ctor ConfigTree::ConfigTree() :_sections() { - + /* YamlParser *parser; try { parser = new YamlParser("sequence.yml"); @@ -61,8 +61,8 @@ ConfigTree::ConfigTree() :_sections() } catch(YamlParserException &e) { _error("ConfigTree: %s", e.what()); - } + } try { parser->composeEvents(); } @@ -77,6 +77,7 @@ ConfigTree::ConfigTree() :_sections() catch (YamlParserException &e) { _error("ConfigTree: %s", e.what()); } + */ } // dtor diff --git a/sflphone-common/src/config/yamlengine.cpp b/sflphone-common/src/config/yamlengine.cpp index 2a75afacfaa68b298eecfbe8a3ef84988814fbdc..30a2545bfdea02643916d02cbbef5565196335fa 100755 --- a/sflphone-common/src/config/yamlengine.cpp +++ b/sflphone-common/src/config/yamlengine.cpp @@ -29,6 +29,8 @@ */ #include "yamlengine.h" +#include "../global.h" + namespace Conf { @@ -36,9 +38,45 @@ YamlEngine::YamlEngine() {} YamlEngine::~YamlEngine() {} -void YamlEngine::open() {} +void YamlEngine::openConfigFile() +{ + + Conf::YamlParser *parser; + + try { + parser = new Conf::YamlParser("sequence.yml"); + } + catch (Conf::YamlParserException &e) { + _error("ConfigTree: %s", e.what()); + } + + try { + parser->serializeEvents(); + } + catch(Conf::YamlParserException &e) { + _error("ConfigTree: %s", e.what()); + } -void YamlEngine::close() {} + try { + document = parser->composeEvents(); + } + catch(Conf::YamlParserException &e) { + _error("ConfigTree: %s", e.what()); + } + + try { + delete parser; + parser = NULL; + } + catch (Conf::YamlParserException &e) { + _error("ConfigTree: %s", e.what()); + } +} + +void YamlEngine::closeConfigFile() +{ + +} void YamlEngine::read() {} diff --git a/sflphone-common/src/config/yamlengine.h b/sflphone-common/src/config/yamlengine.h index 100fc8cc891d318034d5a85c9027674221fefb95..2997760bc2d96da4066c71e491e05f15ea083751 100755 --- a/sflphone-common/src/config/yamlengine.h +++ b/sflphone-common/src/config/yamlengine.h @@ -32,6 +32,7 @@ #define __YAMLENGINE_H__ #include "engine.h" +#include "yamlnode.h" #include "yamlparser.h" #include "yamlemitter.h" #include <exception> @@ -53,9 +54,9 @@ class YamlEngine : public Engine { ~YamlEngine(); - virtual void open(); + virtual void openConfigFile(); - virtual void close(); + virtual void closeConfigFile(); virtual void write(); @@ -67,6 +68,8 @@ class YamlEngine : public Engine { YamlEmitter *emitter; + YamlDocument *document; + }; } diff --git a/sflphone-common/src/config/yamlnode.h b/sflphone-common/src/config/yamlnode.h index d6efa03c08bf1b690143cf4b8ffd4a34ab311e68..934b82faec0a04581eec239e75af6daca4831d47 100755 --- a/sflphone-common/src/config/yamlnode.h +++ b/sflphone-common/src/config/yamlnode.h @@ -71,16 +71,20 @@ class YamlNode { public: - YamlNode(NodeType t) : type(t) {} + YamlNode(NodeType t, YamlNode *top=NULL) : type(t), topNode(top) {} ~YamlNode() {} NodeType getType() { return type; } + YamlNode *getTopNode() { return topNode; } + private: NodeType type; + YamlNode *topNode; + }; @@ -88,7 +92,7 @@ class YamlDocument : YamlNode { public: - YamlDocument() : YamlNode(DOCUMENT) {} + YamlDocument(YamlNode* top=NULL) : YamlNode(DOCUMENT, top) {} ~YamlDocument() {} @@ -106,7 +110,7 @@ class SequenceNode : public YamlNode { public: - SequenceNode() : YamlNode(SEQUENCE) {} + SequenceNode(YamlNode *top) : YamlNode(SEQUENCE, top) {} ~SequenceNode() {} @@ -125,13 +129,13 @@ class MappingNode : public YamlNode { public: - MappingNode() : YamlNode(MAPPING) {} + MappingNode(YamlNode *top) : YamlNode(MAPPING, top) {} ~MappingNode() {} Mapping *getMapping() { return ↦ } - void setKeyValue(Key key, YamlNode *value); + void setKeyValue(Key key, YamlNode *value); void removeKeyValue(Key key); @@ -148,7 +152,7 @@ class ScalarNode : public YamlNode { public: - ScalarNode(Value v="") : YamlNode(SCALAR), val(v) {} + ScalarNode(Value v="", YamlNode *top=NULL) : YamlNode(SCALAR, top), val(v) {} ~ScalarNode() {} diff --git a/sflphone-common/src/config/yamlparser.cpp b/sflphone-common/src/config/yamlparser.cpp index a603293708657d5895ddf4d4f23127786720f675..7090bea7aecb1720eab19e6c3f48598aee4c565e 100755 --- a/sflphone-common/src/config/yamlparser.cpp +++ b/sflphone-common/src/config/yamlparser.cpp @@ -177,11 +177,14 @@ int YamlParser::copyEvent(yaml_event_t *event_to, yaml_event_t *event_from) } -void YamlParser::composeEvents() { +YamlDocument *YamlParser::composeEvents() { if(eventNumber == 0) throw YamlParserException("No event available"); + doc = NULL; + topNode = NULL; + for (int i = 0; i < eventNumber;) { switch(events[i].type) { @@ -191,44 +194,209 @@ void YamlParser::composeEvents() { case YAML_STREAM_END_EVENT: _debug("YAML_STREAM_END_EVENT"); break; - case YAML_DOCUMENT_START_EVENT: + case YAML_DOCUMENT_START_EVENT: { _debug("YAML_DOCUMENT_START_EVENT"); + // startDocument(); break; - case YAML_DOCUMENT_END_EVENT: + } + case YAML_DOCUMENT_END_EVENT: { _debug("YAML_DOCUMENT_END_EVENT"); + // topNode = NULL; break; + } case YAML_ALIAS_EVENT: _debug("YAML_ALIAS_EVENT"); break; - case YAML_SCALAR_EVENT: { + case YAML_SCALAR_EVENT: { _debug("YAML_SCALAR_EVENT: anchor %s, tag %s, value %s", events[i].data.scalar.anchor, events[i].data.scalar.tag, events[i].data.scalar.value); char buffer[1000]; snprintf(buffer, 1000, "%s", events[i].data.scalar.value); - _debug("----------------------------- THE BUFFER: %s", buffer); - ScalarNode *sclr = new ScalarNode(buffer); - _debug("----------------------------- THE VALUE: %s", (sclr->getValue()).c_str()); - // ScalarNode *sclr = new ScalarNode("ok"); - } + composeScalarEvent(topNode, buffer); break; - case YAML_SEQUENCE_START_EVENT: + } + case YAML_SEQUENCE_START_EVENT: { _debug("YAML_SEQUENCE_START_EVENT: anchor %s, tag %s", events[i].data.sequence_start.anchor, events[i].data.sequence_start.tag); + // startSequence(); break; - case YAML_SEQUENCE_END_EVENT: + } + case YAML_SEQUENCE_END_EVENT: { _debug("YAML_SEQUENCE_END_EVENT"); + // endSequence(); break; - case YAML_MAPPING_START_EVENT: + } + case YAML_MAPPING_START_EVENT: { _debug("YAML_MAPPING_START_EVENT: anchor %s, tag %s", events[i].data.mapping_start.anchor, events[i].data.sequence_start.tag); + + Key mapkey; + YamlNode *mapvalue; + + MappingNode *map = new MappingNode(topNode); + + if(events[i+1].type == YAML_SCALAR_EVENT) { + char buffer[1000]; + snprintf(buffer, 1000, "%s", events[i+1].data.scalar.value); + mapkey = Key(buffer); + i++; + } + else + throw YamlParserException("Mapping event not followed by scalar"); + + if(events[i+1].type == YAML_SCALAR_EVENT) { + char buffer[1000]; + snprintf(buffer, 1000, "%s", events[i+1].data.scalar.value); + ScalarNode *sclr = new ScalarNode(buffer, topNode); + mapvalue = (YamlNode *)sclr; + composeMappingEvent(map, mapkey, mapvalue); + } + else if(events[i+1].type == YAML_SEQUENCE_START_EVENT) { + SequenceNode *seq = new SequenceNode(topNode); + mapvalue = (YamlNode *)seq; + composeMappingEvent(map, mapkey, mapvalue); + topNode = (YamlNode *)seq; + } + else + throw YamlParserException("Not acceptable value for mapping"); + break; - case YAML_MAPPING_END_EVENT: + } + case YAML_MAPPING_END_EVENT: { _debug("YAML_MAPPING_END_EVENT"); + // endMapping(); break; + } default: throw YamlParserException("Unknown Event"); } i++; } + + return doc; +} + + +void YamlParser::startDocument() +{ + doc = new YamlDocument(); + + if(!doc) + throw YamlParserException("Not able to create new document"); + + topNode = (YamlNode *)(doc); +} + +void YamlParser::endDocument() +{ + if(!doc || !topNode) + throw YamlParserException("No document to end"); + + if(topNode->getType() != DOCUMENT) + throw YamlParserException("Top node is not a document"); + + topNode = NULL; +} + +void YamlParser::startSequence() +{ + if(!topNode) + throw YamlParserException("No container for sequence"); + + SequenceNode *seq = new SequenceNode(topNode); + + composeSequence(); + topNode = (YamlNode *)seq; +} + +void YamlParser::endSequence() +{ + if(!topNode) + throw YamlParserException("No sequence to stop"); + + if(topNode->getType() != SEQUENCE) + throw YamlParserException("Top node is not a sequence"); + + + topNode = topNode->getTopNode(); +} + +void YamlParser::endMapping() { + + if(!topNode) + throw YamlParserException("No mapping to stop"); + + if(topNode->getType() != MAPPING) + throw YamlParserException("Top node is not a mapping"); + + topNode = topNode->getTopNode(); + +} + +void YamlParser::composeScalarEvent(YamlNode *topNode, char *data) +{ + if(!topNode) + throw YamlParserException("No container for scalar"); + + ScalarNode *sclr = new ScalarNode(data, topNode); + + switch(topNode->getType()) { + case DOCUMENT: + ((YamlDocument *)(topNode))->addNode(sclr); + break; + case SEQUENCE: + ((SequenceNode *)(topNode))->addNode(sclr); + break; + case SCALAR: + case MAPPING: + default: + break; + } + +} + + +void YamlParser::composeMappingEvent(MappingNode *map, Key key, YamlNode *val) +{ + YamlNode *topNode = map->getTopNode(); + + if(!topNode) + throw YamlParserException("No container for mapping"); + + map->setKeyValue(key, val); + + switch(topNode->getType()) { + case DOCUMENT: + ((YamlDocument *)(topNode))->addNode(map); + break; + case SEQUENCE: + ((SequenceNode *)(topNode))->addNode(map); + break; + case SCALAR: + case MAPPING: + default: + break; + } + } +void YamlParser::composeSequenceEvent(YamlNode *topNode, YamlNode *node) +{ + + if(!topNode) + throw YamlParserException("No container for sequence"); + + switch(topNode->getType()) { + case DOCUMENT: + ((YamlDocument *)(topNode))->addNode(node); + break; + case SEQUENCE: + ((SequenceNode *)(topNode))->addNode(node); + break; + case SCALAR: + case MAPPING: + default: + break; + } + +} } diff --git a/sflphone-common/src/config/yamlparser.h b/sflphone-common/src/config/yamlparser.h index 73cc66331a19f641abb2caf437394046191915c5..35c18fb8db20991a343180a74d49dced32822491 100755 --- a/sflphone-common/src/config/yamlparser.h +++ b/sflphone-common/src/config/yamlparser.h @@ -31,6 +31,7 @@ #ifndef __YAMLPARSER_H__ #define __YAMLPARSER_H__ +#include "yamlnode.h" #include <yaml.h> #include <stdio.h> #include <exception> @@ -73,7 +74,7 @@ class YamlParser { void serializeEvents(); - void composeEvents(); + YamlDocument *composeEvents(); private: @@ -82,6 +83,22 @@ class YamlParser { */ int copyEvent(yaml_event_t *event_to, yaml_event_t *event_from); + void startDocument(void); + + void endDocument(void); + + void startSequence(void); + + void endSequence(void); + + void endMapping(void); + + void composeScalarEvent(YamlNode *topNode, char *data); + + void composeMappingEvent(MappingNode *map, Key key, YamlNode *node); + + void composeSequenceEvent(YamlNode *topNode, YamlNode *node); + std::string filename; FILE *fd; @@ -106,6 +123,10 @@ class YamlParser { */ int eventNumber; + YamlNode *topNode; + + YamlDocument *doc; + }; } diff --git a/sflphone-common/test/configurationtest.cpp b/sflphone-common/test/configurationtest.cpp index 488318271c4d7b4419bcf2e4d4a68453f0a8842e..68c0356aed33330c4685792098d57d8f5485ada2 100755 --- a/sflphone-common/test/configurationtest.cpp +++ b/sflphone-common/test/configurationtest.cpp @@ -157,30 +157,16 @@ void ConfigurationTest::testYamlParser() Conf::YamlParser *parser; try { - parser = new Conf::YamlParser("sequence.yml"); - } - catch (Conf::YamlParserException &e) { - _error("ConfigTree: %s", e.what()); - } - - try { + parser = new Conf::YamlParser("sequence.yml"); + parser->serializeEvents(); - } - catch(Conf::YamlParserException &e) { - _error("ConfigTree: %s", e.what()); - } - try { parser->composeEvents(); - } - catch(Conf::YamlParserException &e) { - _error("ConfigTree: %s", e.what()); - } - - try { + delete parser; parser = NULL; + } catch (Conf::YamlParserException &e) { _error("ConfigTree: %s", e.what()); @@ -192,7 +178,10 @@ void ConfigurationTest::testYamlParser() void ConfigurationTest::testYamlComposition() { - Conf::SequenceNode *seq = new Conf::SequenceNode(); + /* + Conf::YamlDocument *doc = new Conf::YamlDocument(); + + Conf::SequenceNode *seq = new Conf::SequenceNode(doc); Conf::MappingNode *map = new Conf::MappingNode(); Conf::ScalarNode *sclr = new Conf::ScalarNode(); @@ -217,7 +206,7 @@ void ConfigurationTest::testYamlComposition() delete seq; delete map; delete sclr; + */ - }