diff options
Diffstat (limited to 'src/addScanners.cpp')
-rw-r--r-- | src/addScanners.cpp | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/src/addScanners.cpp b/src/addScanners.cpp new file mode 100644 index 0000000..2b070a4 --- /dev/null +++ b/src/addScanners.cpp @@ -0,0 +1,135 @@ + + +#include "functions.h" + +#include <iostream> +#include <string> +#include <vector> +#include <queue> + +#include <boost/filesystem.hpp> + +namespace bfs=boost::filesystem; + +/** + * function addScanners(xmlNode* node, char* script) + * ---------------------------------------------------------- + * runs content of script (absolute path of a script-file) + * -> this expects the script to print out scanner information + * in the following format + * + * scanserver\tscanner\tscanner description + * + * all other output has to be directed to /dev/null + * + * then this function add some scanner-nodes to the xml-file + * in "settings/eintrag/scanners" + * (which will be created also if needed.) + * in the following form: <br/> + * + * <scanner name="scanner" path="//scanserver/scanner" > + * Scannerdescription + * </scanner> + */ +bool addScanners(xmlNode* node, char* script) { + + if(node == NULL) { + return false; + } + + bool scanner = false; + vector<string> info_scanner; + + const int MAX_LENGTH = 300; + char line[MAX_LENGTH]; + char delims[] = "\t"; + string strline; + FILE* inp = 0; + + unsigned int tindex = 0; + xmlNodePtr cur = node->children; + xmlNodePtr scannernode = NULL; + + // Get <scanners> node + while(cur != NULL) { + if (!xmlStrcmp(cur->name, (const xmlChar *)"scanners")){ + scanner = true; + scannernode = cur; + break; + } + cur = cur->next; + } + if(! scanner) { + scannernode = xmlNewNode(NULL, (const xmlChar*) "scanners"); + if(scannernode != NULL ) { + xmlAddChild(node, scannernode); + } + else { + cerr << "No <scanners> node created" << endl; + } + } + + // Parse input of scanner-Skript (called by "char* script") + // and write into <scanner> nodes + if( bfs::is_regular(bfs::path(script)) ) + if( (inp = popen(script, "r" )) ) { + while(fgets(line, MAX_LENGTH, inp ) != NULL) { + strline = string(line); + if(strline.length() > 3) { + + queue<unsigned int> temp; + temp.push( strline.find_first_of( delims , 0) ); + + while( temp.back() != string::npos ) { + temp.push( strline.find_first_of( delims, temp.back()+1 ) ); + } + + unsigned int t_front; + string tstr = string(""); + while( tindex != string::npos ) { + + // build scanner-info element + t_front = temp.front(); + + if(tindex == 0) { + tstr = strline.substr(0, t_front); + } + else if(t_front != string::npos) { + tstr = strline.substr(tindex+1, t_front-tindex-1) ; + } + else { + tstr = strline.substr( tindex+1, strline.length() - tindex-2 ); + } + if(tstr.length() > 2) { + info_scanner.push_back( tstr ); + // DEBUG + cout << info_scanner.back() << endl; + } + tindex = t_front; + temp.pop(); + } + + // Construct <scanner> nodes + xmlNodePtr pNode = xmlNewNode(NULL, (const xmlChar*) "scanner"); + xmlNewProp(pNode, (const xmlChar*) "name", (const xmlChar*) info_scanner.at(1).c_str()); + xmlNewProp ( pNode, (const xmlChar*) "path", (const xmlChar*) + string( string( "\\\\" ) + info_scanner.at(0) + string( "\\" ) + info_scanner.at(1) ).c_str() ); + + if(info_scanner.size() > 2) { + xmlAddChild( pNode, xmlNewText( (const xmlChar*) info_scanner.at(2).c_str() ) ); + } + + if(pNode != NULL) { + xmlAddChild( scannernode, pNode); + } + + info_scanner.clear(); + tindex = 0; + } + } + pclose(inp); + } + + return true; +} + |