| 1 | + | /* | 
 
 
 
 
 
 
 
 | 2 | + | * i-scream central monitoring system | 
 
 
 
 
 
 
 
 | 3 | + | * Copyright (C) 2000-2002 i-scream | 
 
 
 
 
 
 
 
 | 4 | + | * | 
 
 
 
 
 
 
 
 | 5 | + | * This program is free software; you can redistribute it and/or | 
 
 
 
 
 
 
 
 | 6 | + | * modify it under the terms of the GNU General Public License | 
 
 
 
 
 
 
 
 | 7 | + | * as published by the Free Software Foundation; either version 2 | 
 
 
 
 
 
 
 
 | 8 | + | * of the License, or (at your option) any later version. | 
 
 
 
 
 
 
 
 | 9 | + | * | 
 
 
 
 
 
 
 
 | 10 | + | * This program is distributed in the hope that it will be useful, | 
 
 
 
 
 
 
 
 | 11 | + | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 
 
 
 
 
 
 
 | 12 | + | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 
 
 
 
 
 
 
 | 13 | + | * GNU General Public License for more details. | 
 
 
 
 
 
 
 
 | 14 | + | * | 
 
 
 
 
 
 
 
 | 15 | + | * You should have received a copy of the GNU General Public License | 
 
 
 
 
 
 
 
 | 16 | + | * along with this program; if not, write to the Free Software | 
 
 
 
 
 
 
 
 | 17 | + | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. | 
 
 
 
 
 
 
 
 | 18 | + | */ | 
 
 
 
 
 
 
 
 | 19 | + |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 20 |  | #include "SysMon.h" | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 21 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 22 |  | SysMon::SysMon( Config config, int printDebug){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 30 |  | // setup some standard variables | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 31 |  | sequence = 0; // no packets sent yet | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 32 |  |  | 
 
 
 
 
 
 
 
 
 | 14 | – | // get our values from config | 
 
 
 
 
 
 
 
 
 | 15 | – |  | 
 
 
 
 
 
 
 
 
 | 16 | – |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 33 |  | // setup our arrays | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 34 |  | titlepointer = 0; | 
 
 
 
 
 
 
 
 
 
 
 | 35 | < | for ( int i=0; i < 40; i++ ){ | 
 
 
 
 
 
 
 
 
 | 35 | > | for ( int i=0; i < max_titles; i++ ){ | 
 
 
 
 
 
 
 
 
 
 
 | 36 |  | titles[i] = ""; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 37 |  | values[i] = ""; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 38 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 44 |  | int SysMon::collect(){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 45 |  | if ( debug == 1 ){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 46 |  | std::cout << "SysMon::collect()\n"; | 
 
 
 
 
 
 
 
 
 
 
 | 47 | < | } | 
 
 
 
 
 
 
 
 
 | 47 | > | } // if | 
 
 
 
 
 
 
 
 
 
 
 | 48 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 49 |  | // say we have checked again | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 50 |  | checks++; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 51 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 52 |  | // collect the system data and place it in an array of strings. | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 53 |  | // presume that the data is all formtted correctly. | 
 
 
 
 
 
 
 
 
 
 
 | 54 | < | char input[2048]; | 
 
 
 
 
 
 
 
 
 | 54 | > |  | 
 
 
 
 
 
 
 
 
 
 
 | 55 |  | if ( debug == 1 ){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 56 |  | std::cout << "SysMon::collect::ipipestream\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 57 |  | } | 
 
 
 
 
 
 
 
 
 
 
 | 58 | < | ipipestream p("statgrab.pl"); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 58 | > |  | 
 
 
 
 
 | 59 | > | p = new SubPipe("./statgrab.pl"); | 
 
 
 
 
 
 
 
 
 
 
 | 60 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 61 |  | // get the output into input from statgrab | 
 
 
 
 
 
 
 
 
 
 
 | 62 | < | while ( p.getline (input, 2048) ){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 63 | < | // find the first non-whitespace char in input | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 64 | < | string sinput = input; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 62 | > | string sinput; | 
 
 
 
 
 | 63 | > | while ( p->getLine(&sinput) == 0 ){ | 
 
 
 
 
 | 64 | > |  | 
 
 
 
 
 | 65 | > | if ( titlepointer == max_titles ){ | 
 
 
 
 
 | 66 | > | std::cout << "WARNING: Max Titles reached, skipping remaining" << endl; | 
 
 
 
 
 | 67 | > | std::cout << "Try recompiling with a value greater than the current (" << max_titles << ")" << endl; | 
 
 
 
 
 | 68 | > | titlepointer--; | 
 
 
 
 
 | 69 | > | break; | 
 
 
 
 
 | 70 | > | } // if | 
 
 
 
 
 | 71 | > |  | 
 
 
 
 
 
 
 
 
 
 
 | 72 |  | // locate the first white space | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 73 |  | int found = sinput.find(" ",0); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 74 |  | if ( found == string::npos ){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 75 |  | // error | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 76 |  | if ( debug == 1 ){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 77 |  | std::cout << "SysMon::collect::Parse error from statgrab.pl\n"; | 
 
 
 
 
 
 
 
 
 
 
 | 78 | < | } | 
 
 
 
 
 
 
 
 
 | 78 | > | } // if | 
 
 
 
 
 
 
 
 
 
 
 | 79 |  | } else { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 80 |  | int gotTitle = 0; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 81 |  | // now use the array of titles and values | 
 
 
 
 
 
 
 
 
 
 
 | 82 | < | for ( int i = 0; i < 60; i++ ){ | 
 
 
 
 
 
 
 
 
 | 82 | > | for ( int i = 0; i < max_titles; i++ ){ | 
 
 
 
 
 
 
 
 
 
 
 | 83 |  | // check against the array value | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 84 |  | if ( titles[i] == sinput.substr(0,found) ){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 85 |  | // is the one we are looking for. | 
 
 
 
 
 
 
 
 
 
 
 | 86 | < | if ( debug == 1 ){ | 
 
 
 
 
 
 
 
 
 | 86 | > | if ( debug == 2 ){ | 
 
 
 
 
 
 
 
 
 
 
 | 87 |  | std::cout << "SysMon::collect::Found Value\n"; | 
 
 
 
 
 
 
 
 
 
 
 | 88 | < | gotTitle = 1; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 89 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 88 | > | } // if debug | 
 
 
 
 
 | 89 | > |  | 
 
 
 
 
 | 90 | > | gotTitle = 1; | 
 
 
 
 
 
 
 
 
 
 
 | 91 |  | // now modify the data in the arrays if they are numbers | 
 
 
 
 
 
 
 
 
 
 
 | 92 | < | int * end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 68 | < | char *buffer; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 69 | < | // buffer = sinput.substr(found+1, sinput.length()); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 70 | < | double dbl = 0; // strtod((char *) sinput.substr(found+1, sinput.length()), &end); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 71 | < | if ( dbl == 0 ){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 72 | < | // error? we aren't so sure. check the position | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 73 | < | // of end. | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 74 | < | if ( *end == sinput.length()-1 ){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 75 | < | // was the end.. ok | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 76 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 77 | < | } // if | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 78 | < | } else { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 79 | < | // must have worked! | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 80 | < | double dbl2 = 0; //strtod(values[i], &end); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 81 | < | dbl2 += dbl; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 82 | < | char *buffer; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 83 | < | int precision = 5; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 84 | < | int decimal, sign; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 85 | < | buffer = ecvt (dbl2, precision, &decimal, &sign); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 86 | < | } // if | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 87 | < | } // if | 
 
 
 
 
 
 
 
 
 | 92 | > | } // if (titles[i]) | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 93 |  | } // for | 
 
 
 
 
 
 
 
 | 94 | + |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 95 |  | // did we find this title? if not add it | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 96 |  | if ( gotTitle == 0 ){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 97 |  | // didnt | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 98 |  | if ( debug == 1 ){ | 
 
 
 
 
 
 
 
 
 
 
 | 99 | < | std::cout << "SysMon::collect::Adding New Value\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 100 | < | std::cout << "'" << sinput.substr(0,found) << "'\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 101 | < | std::cout << "'" <<  sinput.substr(found+1, sinput.length()) << "'\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 102 | < | } | 
 
 
 
 
 
 
 
 
 | 99 | > | std::cout << "SysMon::collect::Adding New Value\n"; | 
 
 
 
 
 | 100 | > | std::cout << "'" << sinput.substr(0,found) << "' : "; | 
 
 
 
 
 | 101 | > | std::cout << "'" <<  sinput.substr(found+1, sinput.length()) << "'\n"; | 
 
 
 
 
 | 102 | > | } // if | 
 
 
 
 
 
 
 
 
 
 
 | 103 |  | titles[titlepointer] = sinput.substr(0,found); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 104 |  | values[titlepointer] = sinput.substr(found+1, sinput.length()); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 105 |  | titlepointer++; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 109 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 110 |  | } // while | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 111 |  |  | 
 
 
 
 
 
 
 
 | 112 | + | // delete the pointer to free up memory | 
 
 
 
 
 
 
 
 | 113 | + | delete p; | 
 
 
 
 
 
 
 
 | 114 | + |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 115 |  | if ( debug == 1 ){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 116 |  | std::cout << "SysMon::collect::Parse from StatGrab finished\n"; | 
 
 
 
 
 
 
 
 
 
 
 | 117 | < | } | 
 
 
 
 
 
 
 
 
 | 117 | > | } // if | 
 
 
 
 
 
 
 
 
 
 
 | 118 |  |  | 
 
 
 
 
 
 
 
 
 | 110 | – | // alert? | 
 
 
 
 
 
 
 
 
 | 111 | – | // return 1; | 
 
 
 
 
 
 
 
 
 | 112 | – |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 119 |  | // return sucessful | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 120 |  | return 0; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 121 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 122 |  | } // collect | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 123 |  |  | 
 
 
 
 
 
 
 
 | 124 | + | void SysMon::clearData(){ | 
 
 
 
 
 
 
 
 | 125 | + |  | 
 
 
 
 
 
 
 
 | 126 | + | titlepointer = 0; | 
 
 
 
 
 
 
 
 | 127 | + | for ( int i=0; i < max_titles; i++ ){ | 
 
 
 
 
 
 
 
 | 128 | + | titles[i] = ""; | 
 
 
 
 
 
 
 
 | 129 | + | values[i] = ""; | 
 
 
 
 
 
 
 
 | 130 | + | } // for | 
 
 
 
 
 
 
 
 | 131 | + |  | 
 
 
 
 
 
 
 
 | 132 | + | return; | 
 
 
 
 
 
 
 
 | 133 | + |  | 
 
 
 
 
 
 
 
 | 134 | + | } // clearData | 
 
 
 
 
 
 
 
 | 135 | + |  | 
 
 
 
 
 
 
 
 | 136 | + |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 137 |  | string SysMon::getData(){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 138 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 139 |  | if ( debug == 1 ){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 140 |  | std::cout << "SysMon::getData()\n"; | 
 
 
 
 
 
 
 
 
 
 
 | 141 | < | } | 
 
 
 
 
 
 
 
 
 | 141 | > | } // if | 
 
 
 
 
 
 
 
 
 
 
 | 142 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 143 |  | // create an xml object | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 144 |  | XMLFormatter xml = XMLFormatter(); | 
 
 
 
 
 
 
 
 | 145 | + |  | 
 
 
 
 
 
 
 
 | 146 | + | if ( debug == 1 ){ | 
 
 
 
 
 
 
 
 | 147 | + | std::cout << "SysMon::getData::Sorting " << titlepointer << " elements\n"; | 
 
 
 
 
 
 
 
 | 148 | + | } // if | 
 
 
 
 
 
 
 
 | 149 | + |  | 
 
 
 
 
 
 
 
 | 150 | + | // firstly sort the data. | 
 
 
 
 
 
 
 
 | 151 | + | // simple bubble sort | 
 
 
 
 
 
 
 
 | 152 | + | int flag = 1; | 
 
 
 
 
 
 
 
 | 153 | + | while ( flag == 1 ){ | 
 
 
 
 
 
 
 
 | 154 | + | flag = 0; | 
 
 
 
 
 
 
 
 | 155 | + | for ( int i=1; i<=titlepointer; i++ ){ | 
 
 
 
 
 
 
 
 | 156 | + | if (titles[i-1].compare(titles[i]) > 0 ){ | 
 
 
 
 
 
 
 
 | 157 | + | // swap them | 
 
 
 
 
 
 
 
 | 158 | + | string temp; | 
 
 
 
 
 
 
 
 | 159 | + | temp = titles[i-1]; | 
 
 
 
 
 
 
 
 | 160 | + | titles[i-1] = titles[i]; | 
 
 
 
 
 
 
 
 | 161 | + | titles[i] = temp; | 
 
 
 
 
 
 
 
 | 162 | + | // now do the values | 
 
 
 
 
 
 
 
 | 163 | + | temp = values[i-1]; | 
 
 
 
 
 
 
 
 | 164 | + | values[i-1] = values[i]; | 
 
 
 
 
 
 
 
 | 165 | + | values[i] = temp; | 
 
 
 
 
 
 
 
 | 166 | + | // say we have changed something | 
 
 
 
 
 
 
 
 | 167 | + | flag = 1; | 
 
 
 
 
 
 
 
 | 168 | + | }  // if | 
 
 
 
 
 
 
 
 | 169 | + | } // for | 
 
 
 
 
 
 
 
 | 170 | + | } // while | 
 
 
 
 
 
 
 
 | 171 | + |  | 
 
 
 
 
 
 
 
 | 172 | + | /* used to check the array has sorted correctly | 
 
 
 
 
 
 
 
 | 173 | + | for ( int i=0; i < titlepointer; i++ ){ | 
 
 
 
 
 
 
 
 | 174 | + | std::cout << titles[i] << endl; | 
 
 
 
 
 
 
 
 | 175 | + | } | 
 
 
 
 
 
 
 
 | 176 | + | */ | 
 
 
 
 
 
 
 
 | 177 | + |  | 
 
 
 
 
 
 
 
 | 178 | + | // work through each one of the titles in turn and | 
 
 
 
 
 
 
 
 | 179 | + | // work out their levels. | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 180 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 181 | < | // spammage | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 182 | < | // xml.addElement(titles[0],values[0]); // version | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 183 | < | xml.addNest("os"); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 184 | < | xml.addElement("name",values[1]);    // packet.os.name | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 185 | < | xml.addElement("release",values[2]); // packet.os.release | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 186 | < | xml.addElement("platform",values[3]); // packet.os.platform | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 187 | < | xml.addElement("sysname",values[4]); // packet.os.sysname | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 188 | < | xml.addElement("version",values[5]); // packet.os.version | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 135 | < | xml.addElement("uptime",values[9]); // packet.os.uptime | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 136 | < | xml.closeNest(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 137 | < | xml.addNest("load"); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 138 | < | xml.addElement("load1",values[6]); // packet.load.load1 | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 139 | < | xml.addElement("load5",values[7]); // packet.load.load5 | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 140 | < | xml.addElement("load15",values[8]); // packet.load.load15 | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 141 | < | xml.closeNest(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 142 | < | xml.addNest("users"); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 143 | < | xml.addElement("count",values[10]); // packet.users.count | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 144 | < | // xml.addElement("list",values[11]);  // packet.users.list | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 145 | < | // xml.addElement("list",values[11]);  // packet.users.list | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 146 | < | xml.closeNest(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 147 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 148 | < |  | 
 
 
 
 
 
 
 
 
 | 181 | > | int count = 0; | 
 
 
 
 
 | 182 | > | string currentLevel = "packet"; | 
 
 
 
 
 | 183 | > | string currentLevels[10]; | 
 
 
 
 
 | 184 | > | int currentLevelint = 0; | 
 
 
 
 
 | 185 | > | int retryCount = 0; | 
 
 
 
 
 | 186 | > | string attributes = ""; | 
 
 
 
 
 | 187 | > | int isAttrib = 0; | 
 
 
 
 
 | 188 | > | string attributeLevel = ""; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 189 |  |  | 
 
 
 
 
 
 
 
 | 190 | + | // init that array quickly ;) | 
 
 
 
 
 
 
 
 | 191 | + | for ( int i=0; i< 10; i++ ){ | 
 
 
 
 
 
 
 
 | 192 | + | currentLevels[i] = ""; | 
 
 
 
 
 
 
 
 | 193 | + | } // for | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 194 |  |  | 
 
 
 
 
 
 
 
 | 195 | + | if ( debug == 1 ){ | 
 
 
 
 
 
 
 
 | 196 | + | std::cout << "SysMon::getData::Starting while\n"; | 
 
 
 
 
 
 
 
 | 197 | + | } // if | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 198 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 199 | < | // xml. | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 200 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 201 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 202 | < | // } // for | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 203 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 199 | > | while ( count <= titlepointer ){ | 
 
 
 
 
 | 200 | > |  | 
 
 
 
 
 | 201 | > | if ( debug == 1 ){ | 
 
 
 
 
 | 202 | > | std::cout << "Processing: " << titles[count] << endl; | 
 
 
 
 
 | 203 | > | } // if | 
 
 
 
 
 | 204 | > |  | 
 
 
 
 
 | 205 | > | retryCount++; | 
 
 
 
 
 | 206 | > |  | 
 
 
 
 
 | 207 | > | currentLevel = ""; | 
 
 
 
 
 | 208 | > | for ( int i=0; i<currentLevelint; i++ ){ | 
 
 
 
 
 | 209 | > | if (( currentLevel != "" ) && ( i != currentLevelint )){ | 
 
 
 
 
 | 210 | > | currentLevel += "."; | 
 
 
 
 
 | 211 | > | } // if | 
 
 
 
 
 | 212 | > | currentLevel += currentLevels[i]; | 
 
 
 
 
 | 213 | > | } // for | 
 
 
 
 
 | 214 | > |  | 
 
 
 
 
 | 215 | > | // set the title into a variable | 
 
 
 
 
 | 216 | > | string currentTitle = titles[count]; | 
 
 
 
 
 | 217 | > |  | 
 
 
 
 
 | 218 | > | // make an array of strings to hold the levels | 
 
 
 
 
 | 219 | > | string levels[10]; | 
 
 
 
 
 | 220 | > | for ( int i=0; i< 10; i++ ){ | 
 
 
 
 
 | 221 | > | levels[i] = ""; | 
 
 
 
 
 | 222 | > | } // for | 
 
 
 
 
 | 223 | > | int level = 0; | 
 
 
 
 
 | 224 | > |  | 
 
 
 
 
 | 225 | > |  | 
 
 
 
 
 | 226 | > | // firstly find the first . | 
 
 
 
 
 | 227 | > | int dotPosition = currentTitle.find("."); | 
 
 
 
 
 | 228 | > |  | 
 
 
 
 
 | 229 | > | while ( dotPosition != string::npos ){ | 
 
 
 
 
 | 230 | > |  | 
 
 
 
 
 | 231 | > | levels[level] = currentTitle.substr(0,dotPosition); | 
 
 
 
 
 | 232 | > |  | 
 
 
 
 
 | 233 | > | // now remove this bit | 
 
 
 
 
 | 234 | > | currentTitle = currentTitle.substr(dotPosition+1); | 
 
 
 
 
 | 235 | > |  | 
 
 
 
 
 | 236 | > | // now find the position of the next dot | 
 
 
 
 
 | 237 | > | dotPosition = currentTitle.find("."); | 
 
 
 
 
 | 238 | > |  | 
 
 
 
 
 | 239 | > | // increment level etc | 
 
 
 
 
 | 240 | > | level++; | 
 
 
 
 
 | 241 | > |  | 
 
 
 
 
 | 242 | > | // we already are at 'packet' level because of | 
 
 
 
 
 | 243 | > | // the outer packet tags, get rif of it , only | 
 
 
 
 
 | 244 | > | // first one mind! | 
 
 
 
 
 | 245 | > | if ( levels[0] == "packet" ){ | 
 
 
 
 
 | 246 | > | level--; | 
 
 
 
 
 | 247 | > | } // if | 
 
 
 
 
 | 248 | > |  | 
 
 
 
 
 | 249 | > | } // while dotPosition | 
 
 
 
 
 | 250 | > |  | 
 
 
 
 
 | 251 | > | // now grab the value title | 
 
 
 
 
 | 252 | > | levels[level] = currentTitle; | 
 
 
 
 
 | 253 | > |  | 
 
 
 
 
 | 254 | > | // now have the levels and the level depth. | 
 
 
 
 
 | 255 | > | // check it against the last one, reconstruct a | 
 
 
 
 
 | 256 | > | // level string | 
 
 
 
 
 | 257 | > |  | 
 
 
 
 
 | 258 | > | // only do this if the 2nd to last string is not | 
 
 
 
 
 | 259 | > | // atrribute | 
 
 
 
 
 | 260 | > | string newLevelString = ""; | 
 
 
 
 
 | 261 | > |  | 
 
 
 
 
 | 262 | > | if ( level > 0 ){ | 
 
 
 
 
 | 263 | > | if ( levels[level-1] != "attributes" ){ | 
 
 
 
 
 | 264 | > | // say it isn't an attribute, but write out | 
 
 
 
 
 | 265 | > | // the attribute first if the last one was | 
 
 
 
 
 | 266 | > | if ( attributeLevel != "" ){ | 
 
 
 
 
 | 267 | > | xml.addElement(attributeLevel,attributes,""); | 
 
 
 
 
 | 268 | > | if ( debug == 1 ){ | 
 
 
 
 
 | 269 | > | std::cout << "Adding Element + attributes" << endl; | 
 
 
 
 
 | 270 | > | } // if | 
 
 
 
 
 | 271 | > |  | 
 
 
 
 
 | 272 | > | } // if | 
 
 
 
 
 | 273 | > | isAttrib = 0; | 
 
 
 
 
 | 274 | > | attributeLevel = ""; | 
 
 
 
 
 | 275 | > | attributes = ""; | 
 
 
 
 
 | 276 | > |  | 
 
 
 
 
 | 277 | > | for ( int i=0; i < level; i++ ){ | 
 
 
 
 
 | 278 | > | newLevelString += levels[i]; | 
 
 
 
 
 | 279 | > | if ( i != level-1 ){ | 
 
 
 
 
 | 280 | > | newLevelString += "."; | 
 
 
 
 
 | 281 | > | } // if | 
 
 
 
 
 | 282 | > | } // for | 
 
 
 
 
 | 283 | > | } // if levels[level] | 
 
 
 
 
 | 284 | > |  | 
 
 
 
 
 | 285 | > | else | 
 
 
 
 
 | 286 | > |  | 
 
 
 
 
 | 287 | > | { | 
 
 
 
 
 | 288 | > | // we need to add to the attributes | 
 
 
 
 
 | 289 | > | level -= 2; | 
 
 
 
 
 | 290 | > | for ( int i=0; i < level; i++ ){ | 
 
 
 
 
 | 291 | > | newLevelString += levels[i]; | 
 
 
 
 
 | 292 | > | if ( i != level-1 ){ | 
 
 
 
 
 | 293 | > | newLevelString += "."; | 
 
 
 
 
 | 294 | > | } // if | 
 
 
 
 
 | 295 | > | } // for | 
 
 
 
 
 | 296 | > |  | 
 
 
 
 
 | 297 | > | isAttrib = 1; | 
 
 
 
 
 | 298 | > | if ( attributeLevel == "" ){ | 
 
 
 
 
 | 299 | > | // set this attribute to be the level | 
 
 
 
 
 | 300 | > | attributeLevel = levels[level]; | 
 
 
 
 
 | 301 | > | } else { | 
 
 
 
 
 | 302 | > | if ( levels[level] != attributeLevel ){ | 
 
 
 
 
 | 303 | > | // arrg! its a different level! | 
 
 
 
 
 | 304 | > | if ( attributeLevel != levels[level] ){ | 
 
 
 
 
 | 305 | > | xml.addElement(attributeLevel,attributes,""); | 
 
 
 
 
 | 306 | > | if ( debug == 1 ){ | 
 
 
 
 
 | 307 | > | std::cout << "Adding Element + attributes1" << endl; | 
 
 
 
 
 | 308 | > | } // if | 
 
 
 
 
 | 309 | > | attributeLevel = ""; | 
 
 
 
 
 | 310 | > | attributes = ""; | 
 
 
 
 
 | 311 | > | count++; | 
 
 
 
 
 | 312 | > | } // if | 
 
 
 
 
 | 313 | > | if ( count == titlepointer ){ | 
 
 
 
 
 | 314 | > | xml.addElement(attributeLevel,attributes,""); | 
 
 
 
 
 | 315 | > | if ( debug == 1 ){ | 
 
 
 
 
 | 316 | > | std::cout << "Adding Element + attributes2" << endl; | 
 
 
 
 
 | 317 | > | } // if | 
 
 
 
 
 | 318 | > | attributeLevel = ""; | 
 
 
 
 
 | 319 | > | attributes = ""; | 
 
 
 
 
 | 320 | > | count++; | 
 
 
 
 
 | 321 | > | } // if | 
 
 
 
 
 | 322 | > | } // if | 
 
 
 
 
 | 323 | > | } // if else | 
 
 
 
 
 | 324 | > |  | 
 
 
 
 
 | 325 | > | } // else attributes | 
 
 
 
 
 | 326 | > | } // if level > 1 | 
 
 
 
 
 | 327 | > | else { | 
 
 
 
 
 | 328 | > | if ( count == titlepointer ){ | 
 
 
 
 
 | 329 | > | if ( attributeLevel != "" ){ | 
 
 
 
 
 | 330 | > | xml.addElement(attributeLevel,attributes,""); | 
 
 
 
 
 | 331 | > | if ( debug == 1 ){ | 
 
 
 
 
 | 332 | > | std::cout << "Adding Element + attributes3" << endl; | 
 
 
 
 
 | 333 | > | } // if | 
 
 
 
 
 | 334 | > | attributeLevel = ""; | 
 
 
 
 
 | 335 | > | attributes = ""; | 
 
 
 
 
 | 336 | > | count++; | 
 
 
 
 
 | 337 | > | } // if | 
 
 
 
 
 | 338 | > | } // if | 
 
 
 
 
 | 339 | > |  | 
 
 
 
 
 | 340 | > |  | 
 
 
 
 
 | 341 | > | for ( int i=0; i < level; i++ ){ | 
 
 
 
 
 | 342 | > | newLevelString += levels[i]; | 
 
 
 
 
 | 343 | > | if ( i != level-1 ){ | 
 
 
 
 
 | 344 | > | newLevelString += "."; | 
 
 
 
 
 | 345 | > | } // if | 
 
 
 
 
 | 346 | > | } // for | 
 
 
 
 
 | 347 | > | } // if level == 1 | 
 
 
 
 
 | 348 | > |  | 
 
 
 
 
 | 349 | > | // check if it is the same | 
 
 
 
 
 | 350 | > | if ( newLevelString == currentLevel ){ | 
 
 
 
 
 | 351 | > | // it is the same level, just add this as another element | 
 
 
 
 
 | 352 | > | if ( isAttrib ){ | 
 
 
 
 
 | 353 | > | attributes += levels[level+2]; | 
 
 
 
 
 | 354 | > | attributes += "=\""; | 
 
 
 
 
 | 355 | > | attributes += values[count]; | 
 
 
 
 
 | 356 | > | attributes += "\" "; | 
 
 
 
 
 | 357 | > |  | 
 
 
 
 
 | 358 | > | } else { | 
 
 
 
 
 | 359 | > | xml.addElement(levels[level],  values[count]); | 
 
 
 
 
 | 360 | > | count++; | 
 
 
 
 
 | 361 | > | if ( debug == 1 ){ | 
 
 
 
 
 | 362 | > | std::cout << "Adding Element" << endl; | 
 
 
 
 
 | 363 | > | } // if | 
 
 
 
 
 | 364 | > | } // if | 
 
 
 
 
 | 365 | > |  | 
 
 
 
 
 | 366 | > | } else { | 
 
 
 
 
 | 367 | > | // gotta change it | 
 
 
 
 
 | 368 | > |  | 
 
 
 
 
 | 369 | > | while( newLevelString.find(currentLevel) == string::npos ){ | 
 
 
 
 
 | 370 | > |  | 
 
 
 
 
 | 371 | > | if ( currentLevelint <= 0 ){ | 
 
 
 
 
 | 372 | > | break; | 
 
 
 
 
 | 373 | > | } // if | 
 
 
 
 
 | 374 | > |  | 
 
 
 
 
 | 375 | > | // back up atleast one level... | 
 
 
 
 
 | 376 | > | xml.closeNest(); | 
 
 
 
 
 | 377 | > | if ( debug == 1 ){ | 
 
 
 
 
 | 378 | > | std::cout << "Closing Nest" << endl; | 
 
 
 
 
 | 379 | > | } // if | 
 
 
 
 
 | 380 | > | // remove the last item | 
 
 
 
 
 | 381 | > | currentLevelint--; | 
 
 
 
 
 | 382 | > |  | 
 
 
 
 
 | 383 | > | currentLevel = ""; | 
 
 
 
 
 | 384 | > | for ( int i=0; i<currentLevelint; i++ ){ | 
 
 
 
 
 | 385 | > | currentLevel += currentLevels[i]; | 
 
 
 
 
 | 386 | > | if ( i != currentLevelint-1 ){ | 
 
 
 
 
 | 387 | > | currentLevel += "."; | 
 
 
 
 
 | 388 | > | } // if | 
 
 
 
 
 | 389 | > | } // for | 
 
 
 
 
 | 390 | > |  | 
 
 
 
 
 | 391 | > | } // while | 
 
 
 
 
 | 392 | > |  | 
 
 
 
 
 | 393 | > |  | 
 
 
 
 
 | 394 | > | while ( newLevelString != currentLevel ){ | 
 
 
 
 
 | 395 | > |  | 
 
 
 
 
 | 396 | > | // now got to a level which we like. | 
 
 
 
 
 | 397 | > | currentLevels[currentLevelint] = levels[currentLevelint]; | 
 
 
 
 
 | 398 | > |  | 
 
 
 
 
 | 399 | > | // add in one more level and restart the loop | 
 
 
 
 
 | 400 | > | xml.addNest(levels[currentLevelint]); | 
 
 
 
 
 | 401 | > | if ( debug == 1 ){ | 
 
 
 
 
 | 402 | > | std::cout << "Adding nest " << levels[currentLevelint] << endl; | 
 
 
 
 
 | 403 | > | } // if | 
 
 
 
 
 | 404 | > |  | 
 
 
 
 
 | 405 | > | // set this to be the top level of the new level | 
 
 
 
 
 | 406 | > | currentLevelint++; | 
 
 
 
 
 | 407 | > |  | 
 
 
 
 
 | 408 | > | currentLevel = ""; | 
 
 
 
 
 | 409 | > | for ( int i=0; i<currentLevelint; i++ ){ | 
 
 
 
 
 | 410 | > | currentLevel += currentLevels[i]; | 
 
 
 
 
 | 411 | > | if ( i != currentLevelint-1 ){ | 
 
 
 
 
 | 412 | > | currentLevel += "."; | 
 
 
 
 
 | 413 | > | } // if | 
 
 
 
 
 | 414 | > | } // for | 
 
 
 
 
 | 415 | > |  | 
 
 
 
 
 | 416 | > | } // while | 
 
 
 
 
 | 417 | > |  | 
 
 
 
 
 | 418 | > |  | 
 
 
 
 
 | 419 | > | } // if | 
 
 
 
 
 | 420 | > |  | 
 
 
 
 
 | 421 | > | if ( debug == 1 ){ | 
 
 
 
 
 | 422 | > | std::cout << "Retrying Main While" << endl; | 
 
 
 
 
 | 423 | > | } // if | 
 
 
 
 
 | 424 | > |  | 
 
 
 
 
 | 425 | > | if ( retryCount > 10 ){ | 
 
 
 
 
 | 426 | > | count++; | 
 
 
 
 
 | 427 | > | if ( debug == 1 ){ | 
 
 
 
 
 | 428 | > | std::cout << "Tried too many times" << endl; | 
 
 
 
 
 | 429 | > | } // if | 
 
 
 
 
 | 430 | > | retryCount = 0; | 
 
 
 
 
 | 431 | > | } // if | 
 
 
 
 
 | 432 | > |  | 
 
 
 
 
 | 433 | > | } // while | 
 
 
 
 
 | 434 | > |  | 
 
 
 
 
 | 435 | > | if ( debug == 1 ){ | 
 
 
 
 
 | 436 | > | std::cout << "\n"; | 
 
 
 
 
 | 437 | > | } // if | 
 
 
 
 
 | 438 | > |  | 
 
 
 
 
 
 
 
 
 
 
 | 439 |  | // return the string | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 440 |  | return xml.returnXML(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 441 |  |  |