Commit c8164af5 authored by Alexandre Savard's avatar Alexandre Savard

[#3648] cleanup yaml parser

parent f2afbaff
......@@ -50,6 +50,12 @@ YamlNode *YamlDocument::popNode()
return node;
}
void MappingNode::addNode(YamlNode *node)
{
Mapping::iterator it = map.end();
map.insert(it, std::pair<Key, YamlNode *>(tmpKey, node));
}
void MappingNode::setKeyValue(Key key, YamlNode *value)
{
Mapping::iterator it = map.end();
......
......@@ -135,6 +135,10 @@ class MappingNode : public YamlNode {
Mapping *getMapping() { return &map; }
void addNode(YamlNode *node);
void setTmpKey(Key key) { tmpKey = key; }
void setKeyValue(Key key, YamlNode *value);
void removeKeyValue(Key key);
......@@ -145,6 +149,8 @@ class MappingNode : public YamlNode {
Mapping map;
Key tmpKey;
};
......
......@@ -182,24 +182,18 @@ YamlDocument *YamlParser::composeEvents() {
if(eventNumber == 0)
throw YamlParserException("No event available");
doc = NULL;
topNode = NULL;
if(events[0].type != YAML_STREAM_START_EVENT)
throw YamlParserException("Parsing does not start with stream start");
eventIndex = 0;
processStream();
/*
for (int i = 0; i < eventNumber;) {
switch(events[i].type) {
case YAML_STREAM_START_EVENT:
_debug("YAML_STREAM_START_EVENT");
break;
case YAML_STREAM_END_EVENT:
_debug("YAML_STREAM_END_EVENT");
break;
case YAML_DOCUMENT_START_EVENT: {
_debug("YAML_DOCUMENT_START_EVENT");
// startDocument();
break;
}
case YAML_DOCUMENT_END_EVENT: {
_debug("YAML_DOCUMENT_END_EVENT");
// topNode = NULL;
break;
......@@ -209,9 +203,11 @@ YamlDocument *YamlParser::composeEvents() {
break;
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);
composeScalarEvent(topNode, buffer);
break;
}
case YAML_SEQUENCE_START_EVENT: {
......@@ -226,7 +222,7 @@ YamlDocument *YamlParser::composeEvents() {
}
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;
......@@ -256,7 +252,7 @@ YamlDocument *YamlParser::composeEvents() {
}
else
throw YamlParserException("Not acceptable value for mapping");
break;
}
case YAML_MAPPING_END_EVENT: {
......@@ -270,73 +266,67 @@ YamlDocument *YamlParser::composeEvents() {
i++;
}
*/
return doc;
}
void YamlParser::processStream () {
void YamlParser::startDocument()
{
doc = new YamlDocument();
while((eventIndex < eventNumber) && (events[eventIndex].type != YAML_STREAM_END_EVENT)) {
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(events[eventIndex].type == YAML_DOCUMENT_START_EVENT)
processDocument();
if(topNode->getType() != DOCUMENT)
throw YamlParserException("Top node is not a document");
eventIndex++;
}
topNode = NULL;
if(events[eventIndex].type != YAML_STREAM_END_EVENT)
throw YamlParserException("Did not found end of stream");
}
void YamlParser::startSequence()
{
if(!topNode)
throw YamlParserException("No container for sequence");
SequenceNode *seq = new SequenceNode(topNode);
composeSequence();
topNode = (YamlNode *)seq;
}
void YamlParser::endSequence()
void YamlParser::processDocument()
{
if(!topNode)
throw YamlParserException("No sequence to stop");
if(topNode->getType() != SEQUENCE)
throw YamlParserException("Top node is not a sequence");
topNode = topNode->getTopNode();
}
doc = new YamlDocument();
void YamlParser::endMapping() {
if(!doc)
throw YamlParserException("Not able to create new document");
if(!topNode)
throw YamlParserException("No mapping to stop");
while((eventIndex < eventNumber) && (events[eventIndex].type != YAML_DOCUMENT_END_EVENT)) {
if(topNode->getType() != MAPPING)
throw YamlParserException("Top node is not a mapping");
switch(events[eventIndex].type){
case YAML_SCALAR_EVENT:
processScalar((YamlNode *)doc);
break;
case YAML_SEQUENCE_START_EVENT:
processSequence((YamlNode *)doc);
break;
case YAML_MAPPING_START_EVENT:
processMapping((YamlNode *)doc);
break;
default:
break;
}
topNode = topNode->getTopNode();
eventIndex++;
}
if(events[eventIndex].type != YAML_DOCUMENT_END_EVENT)
throw YamlParserException("Did not found end of document");
}
void YamlParser::composeScalarEvent(YamlNode *topNode, char *data)
void YamlParser::processScalar(YamlNode *topNode)
{
if(!topNode)
throw YamlParserException("No container for scalar");
ScalarNode *sclr = new ScalarNode(data, topNode);
char buffer[1000];
snprintf(buffer, 1000, "%s", events[eventIndex].data.scalar.value);
ScalarNode *sclr = new ScalarNode(buffer, topNode);
switch(topNode->getType()) {
case DOCUMENT:
......@@ -345,58 +335,111 @@ void YamlParser::composeScalarEvent(YamlNode *topNode, char *data)
case SEQUENCE:
((SequenceNode *)(topNode))->addNode(sclr);
break;
case SCALAR:
case MAPPING:
((MappingNode *)(topNode))->addNode(sclr);
case SCALAR:
default:
break;
}
}
void YamlParser::composeMappingEvent(MappingNode *map, Key key, YamlNode *val)
void YamlParser::processSequence(YamlNode *topNode)
{
YamlNode *topNode = map->getTopNode();
if(!topNode)
throw YamlParserException("No container for mapping");
throw YamlParserException("No container for sequence");
map->setKeyValue(key, val);
SequenceNode *seq = new SequenceNode(topNode);
switch(topNode->getType()) {
case DOCUMENT:
((YamlDocument *)(topNode))->addNode(map);
((YamlDocument *)(topNode))->addNode(seq);
break;
case SEQUENCE:
((SequenceNode *)(topNode))->addNode(map);
((SequenceNode *)(topNode))->addNode(seq);
break;
case SCALAR:
case MAPPING:
((MappingNode *)(topNode))->addNode(seq);
case SCALAR:
default:
break;
}
while((eventIndex < eventNumber) < (events[eventIndex].type != YAML_SEQUENCE_END_EVENT)) {
switch(events[eventIndex].type){
case YAML_SCALAR_EVENT:
processScalar(seq);
break;
case YAML_SEQUENCE_START_EVENT:
processSequence(seq);
break;
case YAML_MAPPING_START_EVENT:
processMapping(seq);
break;
default:
break;
}
eventIndex++;
}
if(events[eventIndex].type != YAML_SEQUENCE_END_EVENT)
throw YamlParserException("Did not found end of sequence");
}
void YamlParser::composeSequenceEvent(YamlNode *topNode, YamlNode *node)
{
void YamlParser::processMapping(YamlNode *topNode)
{
if(!topNode)
throw YamlParserException("No container for sequence");
throw YamlParserException("No container for mapping");
MappingNode *map = new MappingNode(topNode);
switch(topNode->getType()) {
case DOCUMENT:
((YamlDocument *)(topNode))->addNode(node);
((YamlDocument *)(topNode))->addNode(map);
break;
case SEQUENCE:
((SequenceNode *)(topNode))->addNode(node);
((SequenceNode *)(topNode))->addNode(map);
break;
case SCALAR:
case MAPPING:
((MappingNode *)(topNode))->addNode(map);
case SCALAR:
default:
break;
}
while((eventIndex < eventNumber) < (events[eventIndex].type != YAML_MAPPING_END_EVENT)) {
if(events[eventIndex].type != YAML_SCALAR_EVENT)
throw YamlParserException("Mapping not followed by a key");
char buffer[1000];
snprintf(buffer, 1000, "%s", events[eventIndex].data.scalar.value);
map->setTmpKey(Key(buffer));
eventIndex++;
switch(events[eventIndex].type){
case YAML_SCALAR_EVENT:
processScalar(map);
break;
case YAML_SEQUENCE_START_EVENT:
processSequence(map);
break;
case YAML_MAPPING_START_EVENT:
processMapping(map);
break;
default:
break;
}
eventIndex++;
}
if(events[eventIndex].type != YAML_MAPPING_END_EVENT)
throw YamlParserException("Did not found end of mapping");
}
}
......@@ -83,21 +83,15 @@ class YamlParser {
*/
int copyEvent(yaml_event_t *event_to, yaml_event_t *event_from);
void startDocument(void);
void processStream(void);
void endDocument(void);
void processDocument(void);
void startSequence(void);
void processScalar(YamlNode *topNode);
void endSequence(void);
void processSequence(YamlNode *topNode);
void endMapping(void);
void composeScalarEvent(YamlNode *topNode, char *data);
void composeMappingEvent(MappingNode *map, Key key, YamlNode *node);
void composeSequenceEvent(YamlNode *topNode, YamlNode *node);
void processMapping(YamlNode *topNode);
std::string filename;
......@@ -123,10 +117,10 @@ class YamlParser {
*/
int eventNumber;
YamlNode *topNode;
YamlDocument *doc;
int eventIndex;
};
}
......
......@@ -158,7 +158,7 @@ void ConfigurationTest::testYamlParser()
Conf::YamlParser *parser;
try {
parser = new Conf::YamlParser("sequence.yml");
parser = new Conf::YamlParser("sequence2.yml");
parser->serializeEvents();
......
accounts:
- id: 1234
alias: sfl-181
username: 181
password: sfl-181pw
hostname: sflphone.org
enable: true
type: sip
- id: 2345
alias: sfl-431
username: 431
password: alexandre
hostname: 192.168.50.3
enable: true
type: sip
accounts:
- id: 1234
alias: sfl-181
username: 181
password: sfl-181pw
hostname: sflphone.org
enable: true
type: sip
- id: 2345
alias: sfl-431
username: 431
password: alexandre
hostname: 192.168.50.3
enable: true
type: sip
expire: 3600
interface: lo
port: 5065
mailbox: 97
publishaddr: 127.0.0.1
publishport: 5065
sameaslocal: true
resolveonce: false
codecs: 0/9/110/111/112/
credential:
count: 0
srtp:
enable: true
keyexchange: sdes
rtpfallback: true
zrtp:
displaySas: true
displaySasOnce: false
helloHashEnabled: true
notSuppWarning: true
tls:
certificate: /home/msavard/Development/sflphone/sflphone-client-gnome/config.guess
calist: /home/msavard/Development/sflphone/sflphone-client-gnome/aclocal.m4
ciphers:
enable: true
method: TLSv1
timeout: 0
password:
privatekey: /home/msavard/Development/sflphone/sflphone-client-gnome/config.log
requirecertif: true
server:
verifyclient: true
verifyserver: true
addressbook:
photo: false
enabled: true
list: 1243608768.30329.0@emilou-desktop/1243456917.15690.23@emilou-desktop/
max_results: 25
business: true
home: false
mobile: false
audio:
alsa:
cardin: 0
cardout: 0
cardout: 0
framesize: 20
plugin: default
smplrate: 44100
pulse:
devicePlayback:
deviceRecord:
deviceRingtone:
recordpath: /home/msavard/Bureau
ringchoice: /usr/share/sflphone/ringtones/konga.ul
volumemic: 100
volumespkr: 100
hooks:
iax2Enabled: false
numberAddPrefix: false
numberEnabled: false
sipEnabled: false
urlCommand: x-www-browser
urlSipField: X-sflphone-url
preferences:
order: 1234/2345
audioapi: 0
dialpaddisplay: 0
historyenabled: 1
historylimit: 30
historymaxCalls: 20
notifyall: true
notifymails: false
zoneToneChoice: North America
registrationexpire: 180
ringtonesenable: true
portnum: 5060
searchbardisplay: true
starthidden: 0
volumedisplay: 0
windowheight: 332
windowpopup: 0
windowposition: 0
windowposition: 24
windowwidth: 240
zeroconfenable: false
md5Hash: false
voiplink:
playDtmf: true
playTones: true
pulseLength: 250
sendDTMFas: 0
stunenable: 0
stunserver: stun.sflphone.org
symmetric: true
zidFile: sfl.zid
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment