#include <AnyAgent.h>
Public Member Functions | |
AnyAgent () | |
~AnyAgent () | |
YCPValue | Read (const YCPPath &path, const YCPValue &arg=YCPNull(), const YCPValue &opt=YCPNull()) |
YCPBoolean | Write (const YCPPath &path, const YCPValue &value, const YCPValue &arg=YCPNull()) |
YCPList | Dir (const YCPPath &path) |
YCPValue | otherCommand (const YCPTerm &term) |
Private Types | |
enum | { MTYPE_NONE, MTYPE_FILE, MTYPE_PROG, MTYPE_LOCAL } |
Private Member Functions | |
YCPValue | readValueByPath (const YCPValue &value, const YCPPath &path) |
YCPValue | writeValueByPath (const YCPValue ¤t, const YCPPath &path, const YCPValue &value) |
YCPValue | findSyntax (const YCPValue &syntax, const YCPPath &path) |
const char * | get_line (FILE *fp) |
YCPValue | parseIp4Number (char const *&lptr, bool optional) |
const string | unparseIp4Number (const YCPValue &value) |
YCPValue | parseBoolean (char const *&lptr, bool optional) |
const string | unparseBoolean (const YCPValue &value) |
YCPValue | parseNumber (char const *&lptr, bool optional) |
const string | unparseNumber (const YCPValue &value) |
YCPValue | parseHexval (char const *&lptr, bool optional) |
const string | unparseHexval (const YCPValue &value) |
YCPValue | parseString (char const *&lptr, const char *set, const char *stripped, bool optional) |
const string | unparseString (const YCPValue &syntax, const YCPValue &stripped, const YCPValue &value) |
YCPValue | parseFloat (char const *&lptr, bool optional) |
const string | unparseFloat (const YCPValue &value) |
YCPValue | parseHostname (char const *&lptr, bool optional) |
const string | unparseHostname (const YCPValue &value) |
YCPValue | parseUsername (char const *&lptr, bool optional) |
const string | unparseUsername (const YCPValue &value) |
YCPValue | parseVerbose (char const *&lptr, const char *match, bool optional) |
const string | unparseVerbose (const YCPValue &value) |
YCPValue | parseSeparator (char const *&lptr, const char *match, bool optional) |
const string | unparseSeparator (const YCPValue &match) |
const char * | getLine (void) |
const string | putLine (const string s) |
YCPValue | parseChoice (char const *&line, const YCPList &syntax, bool optional) |
const string | unparseChoice (const YCPList &syntax, const YCPValue &value) |
YCPValue | parseSequence (char const *&line, const YCPList &syntax, bool optional) |
const string | unparseSequence (const YCPList &syntax, const YCPValue &value) |
YCPValue | parseList (char const *&line, const YCPList &syntax, bool optional) |
const string | unparseList (const YCPList &syntax, const YCPValue &value) |
YCPValue | parseTuple (char const *&line, const YCPList &syntax, bool optional) |
const string | unparseTuple (const YCPList &syntax, const YCPValue &value) |
YCPValue | parseData (char const *&line, const YCPValue &syntax, bool optional) |
const string | unparseData (const YCPValue &syntax, const YCPValue &value) |
YCPValue | validateCache (const YCPList &data, const YCPValue &arg=YCPNull()) |
YCPValue | readFile (const YCPValue &arg) |
const string | writeFile (const YCPValue &arg) |
string | evalArg (const YCPValue &arg) |
int | lineNumber () const |
Private Attributes | |
bool | description_read |
time_t | mtime |
YCPValue | cache |
bool | cchanged |
YCPList | alldata |
bool | achanged |
bool | mReadOnly |
enum AnyAgent:: { ... } | mType |
YCPValue | mName |
string | mComment |
bool | isFillup |
YCPValue | mSyntax |
YCPValue | mHeader |
int | line_number |
stack< string > | tupleName |
stack< YCPValue > | tupleValue |
bool | tupleContinue |
AnyAgent::AnyAgent | ( | ) |
Creates a new AnyAgent.
Purpose: generalized agent handler for handling system files from /proc and /etc
Creator: kkaempf@suse.de Maintainer: kkaempf@suse.de
loads syntax description at startup to read and write system file
loads complete file (incl. comments) to internal YCPListRep and provides valid (i.e. non-comment) lines in another data structure defined by syntax.
Syntax description:
Header (<syntax>) Header to write at start of file, used only by Write ()
List (<syntax>, terminal) list of syntax, separated by terminal character represented as YCPListRep
Tuple (<name> (<syntax>), ...) // fixed name tuple of syntax represented as YCPMapRep with <name>
Separator (<string>) separator characters used to separate data elements
Sequence (<syntax>,...) sequence of syntactical constructs
Choice ([<match>, <opt-action>], ...) <string> string constant, verbose match
Whitespace () == Separator (" \t")
String (<string>) string match consisting of characters from <string> if <string> starts with ^, set of characters that do not match represented as YCPStringRep. if <optional-stripped> is given (as a string constant!), these characters are stripped from the match if they're found as leading or trailing characters. i.e. given the string " xxx xxx " matches String (" x") completely and results in " xxx xxx ". With String (" x", " "), leading and trailing blanks are stripped. So " xxx xxx " is still matched but the result is "xxx xxx". When writing such values, stripping is also performed. So writing " xxx xxx " results in the output of "xxx xxx"
Number () integer represented as YCPIntegerRep
Hexval () hexadecimal value represented as YCPIntegerRep
Float () floating point represented as YCPFloatRep
Ip4Number () IP4 address as nnn.nnn.nnn.nnn represented as YCPIntegerRep
Hostname () hostname, with or without domain represented as YCPStringRep
Username () username represented as YCPStringRep
Var (...Name (syntax) ... Value (syntax))
AnyAgent::~AnyAgent | ( | ) |
Cleans up
Get a list of all subtrees.
Dir
show subtree
Implements SCRAgent.
References YCPList::add(), description_read, mSyntax, and ycp2error.
string AnyAgent::evalArg | ( | const YCPValue & | arg | ) | [private] |
References YCPElement::isNull(), mName, YCPTerm::name(), YCPList::size(), YCPTerm::size(), YCPList::value(), YCPTerm::value(), and y2error.
Referenced by readFile(), and Write().
findSyntax
find syntax for path
References YCPTerm::name(), YCPTerm::size(), YCPTerm::value(), y2debug, y2error, YT_STRING, and YT_TERM.
Referenced by Write().
const char * AnyAgent::get_line | ( | FILE * | fp | ) | [private] |
char const * AnyAgent::getLine | ( | void | ) | [private] |
References alldata, isFillup, YCPElement::isNull(), line_number, mComment, YCPList::size(), YCPList::value(), and y2debug.
Referenced by parseData().
int AnyAgent::lineNumber | ( | ) | const [private] |
References line_number.
Evaluates the Description () command
Reimplemented from SCRAgent.
References description_read, isFillup, mComment, mHeader, mName, mReadOnly, mSyntax, mType, MTYPE_FILE, MTYPE_LOCAL, MTYPE_NONE, MTYPE_PROG, YCPTerm::name(), YCPTerm::size(), YCPTerm::value(), y2debug, y2warning, and ycp2error.
YCPValue AnyAgent::parseBoolean | ( | char const *& | lptr, | |
bool | optional | |||
) | [private] |
YCPValue AnyAgent::parseChoice | ( | char const *& | line, | |
const YCPList & | syntax, | |||
bool | optional | |||
) | [private] |
References YCPElement::isNull(), parseData(), YCPList::size(), YCPList::value(), y2debug, and y2error.
Referenced by parseData().
YCPValue AnyAgent::parseData | ( | char const *& | line, | |
const YCPValue & | syntax, | |||
bool | optional | |||
) | [private] |
References YCPTerm::args(), getLine(), isFillup, YCPElement::isNull(), KEY4FILLUP, mComment, mReadOnly, YCPTerm::name(), parseBoolean(), parseChoice(), parseFloat(), parseHexval(), parseHostname(), parseIp4Number(), parseList(), parseNumber(), parseSeparator(), parseSequence(), parseString(), parseTuple(), parseUsername(), parseVerbose(), YCPTerm::size(), tupleContinue, tupleName, tupleValue, YCPTerm::value(), y2debug, y2error, YT_STRING, and YT_TERM.
Referenced by parseChoice(), parseList(), parseSequence(), parseTuple(), and validateCache().
YCPValue AnyAgent::parseFloat | ( | char const *& | lptr, | |
bool | optional | |||
) | [private] |
YCPValue AnyAgent::parseHexval | ( | char const *& | lptr, | |
bool | optional | |||
) | [private] |
YCPValue AnyAgent::parseHostname | ( | char const *& | lptr, | |
bool | optional | |||
) | [private] |
YCPValue AnyAgent::parseIp4Number | ( | char const *& | lptr, | |
bool | optional | |||
) | [private] |
Purpose: basic type handling for AnyAgent
Creator: kkaempf@suse.de Maintainer: kkaempf@suse.de
References y2error.
Referenced by parseData().
YCPValue AnyAgent::parseList | ( | char const *& | line, | |
const YCPList & | syntax, | |||
bool | optional | |||
) | [private] |
References YCPElement::isNull(), parseData(), YCPList::value(), and y2debug.
Referenced by parseData().
YCPValue AnyAgent::parseNumber | ( | char const *& | lptr, | |
bool | optional | |||
) | [private] |
YCPValue AnyAgent::parseSeparator | ( | char const *& | lptr, | |
const char * | match, | |||
bool | optional | |||
) | [private] |
Referenced by parseData().
YCPValue AnyAgent::parseSequence | ( | char const *& | line, | |
const YCPList & | syntax, | |||
bool | optional | |||
) | [private] |
References YCPElement::isNull(), parseData(), YCPList::size(), YCPList::value(), and y2debug.
Referenced by parseData().
YCPValue AnyAgent::parseString | ( | char const *& | lptr, | |
const char * | set, | |||
const char * | stripped, | |||
bool | optional | |||
) | [private] |
Referenced by parseData().
YCPValue AnyAgent::parseTuple | ( | char const *& | line, | |
const YCPList & | syntax, | |||
bool | optional | |||
) | [private] |
References YCPElement::isNull(), parseData(), YCPList::size(), tupleContinue, tupleName, tupleValue, YCPList::value(), and y2debug.
Referenced by parseData().
YCPValue AnyAgent::parseUsername | ( | char const *& | lptr, | |
bool | optional | |||
) | [private] |
YCPValue AnyAgent::parseVerbose | ( | char const *& | lptr, | |
const char * | match, | |||
bool | optional | |||
) | [private] |
Referenced by parseData().
const string AnyAgent::putLine | ( | const string | s | ) | [private] |
YCPValue AnyAgent::Read | ( | const YCPPath & | path, | |
const YCPValue & | arg = YCPNull () , |
|||
const YCPValue & | optarg = YCPNull () | |||
) | [virtual] |
Reads data. Destroy the result after use.
path | Specifies what part of the subtree should be read. The path is specified _relatively_ to Root()! |
read value from relative path
Implements SCRAgent.
References alldata, description_read, isFillup, mComment, mName, mSyntax, readValueByPath(), YCPList::size(), validateCache(), YCPList::value(), y2debug, y2error, and ycp2error.
readFile
read complete file to alldata
References achanged, YCPList::add(), alldata, evalArg(), get_line(), mName, mtime, mType, MTYPE_PROG, y2debug, y2error, and ycp2error.
Referenced by validateCache().
readValueByPath
read sub-value denoted by path
if path == .<num> && value->isList() return element <num> of list
if path == .<name> && value->isMap() return element <name> of list
References YCPElement::isNull(), and y2error.
Referenced by Read().
const string AnyAgent::unparseBoolean | ( | const YCPValue & | value | ) | [private] |
Referenced by unparseData().
References YCPTerm::args(), YCPElement::isNull(), YCPTerm::name(), YCPTerm::size(), tupleContinue, tupleName, tupleValue, unparseBoolean(), unparseChoice(), unparseFloat(), unparseHostname(), unparseIp4Number(), unparseList(), unparseNumber(), unparseSeparator(), unparseSequence(), unparseString(), unparseTuple(), unparseUsername(), unparseVerbose(), YCPTerm::value(), y2debug, y2error, YT_STRING, and YT_TERM.
Referenced by unparseList(), unparseTuple(), Write(), and writeFile().
const string AnyAgent::unparseFloat | ( | const YCPValue & | value | ) | [private] |
const string AnyAgent::unparseHexval | ( | const YCPValue & | value | ) | [private] |
References YCPElement::isNull(), and y2debug.
const string AnyAgent::unparseHostname | ( | const YCPValue & | value | ) | [private] |
const string AnyAgent::unparseIp4Number | ( | const YCPValue & | value | ) | [private] |
References YCPElement::isNull(), YCPTerm::name(), YCPList::size(), unparseData(), YCPList::value(), y2debug, y2error, and YT_TERM.
Referenced by unparseData().
const string AnyAgent::unparseNumber | ( | const YCPValue & | value | ) | [private] |
const string AnyAgent::unparseSeparator | ( | const YCPValue & | match | ) | [private] |
Referenced by unparseData().
References isFillup, YCPElement::isNull(), KEY4FILLUP, YCPTerm::name(), YCPList::size(), unparseData(), YCPList::value(), YCPMap::value(), y2debug, y2error, and YT_TERM.
Referenced by unparseData().
const string AnyAgent::unparseUsername | ( | const YCPValue & | value | ) | [private] |
const string AnyAgent::unparseVerbose | ( | const YCPValue & | value | ) | [private] |
YCPValue AnyAgent::validateCache | ( | const YCPList & | data, | |
const YCPValue & | arg = YCPNull () | |||
) | [private] |
validateCache
parse file according to mSyntax and construct YCPValueRep
References alldata, cache, cchanged, YCPElement::isNull(), line_number, mSyntax, parseData(), readFile(), y2debug, and ycp2error.
YCPBoolean AnyAgent::Write | ( | const YCPPath & | path, | |
const YCPValue & | value, | |||
const YCPValue & | arg = YCPNull () | |||
) | [virtual] |
Writes data. Destroy the result after use.
Write
write value to relative path
return YCPIntegerRep(0) if ok or YCPVoidRep if error
Approach:
descend path to get syntax (gives expected syntax of value) unparse value according to syntax (gives string if value matches syntax, else error) set new value to cache
Implements SCRAgent.
References YCPList::add(), alldata, description_read, evalArg(), findSyntax(), YCPElement::isNull(), mName, mReadOnly, mSyntax, YCPList::size(), unparseData(), validateCache(), YCPList::value(), y2debug, and ycp2error.
const string AnyAgent::writeFile | ( | const YCPValue & | arg | ) | [private] |
writeFile
References YCPElement::isNull(), mHeader, and unparseData().
YCPValue AnyAgent::writeValueByPath | ( | const YCPValue & | current, | |
const YCPPath & | path, | |||
const YCPValue & | value | |||
) | [private] |
writeValueByPath
write sub-value denoted by path to current
return new current
if path == .<num> && value->isList() return element <num> of list
if path == .<name> && value->isMap() return element <name> of list
References YCPElement::isNull(), run, y2debug, and y2error.
bool AnyAgent::achanged [private] |
Referenced by readFile().
YCPList AnyAgent::alldata [private] |
Referenced by getLine(), Read(), readFile(), validateCache(), and Write().
YCPValue AnyAgent::cache [private] |
Referenced by validateCache().
bool AnyAgent::cchanged [private] |
Referenced by validateCache().
bool AnyAgent::description_read [private] |
Starts with false and is set to true as soon as the Description is read. Any Read/Write/Dir command prior to the reading of the description is invalid.
Referenced by Dir(), otherCommand(), Read(), and Write().
bool AnyAgent::isFillup [private] |
Referenced by getLine(), otherCommand(), parseData(), Read(), and unparseTuple().
int AnyAgent::line_number [private] |
Used for line counting while parsing the target file.
Referenced by getLine(), lineNumber(), and validateCache().
string AnyAgent::mComment [private] |
comment characters
Referenced by getLine(), otherCommand(), parseData(), and Read().
YCPValue AnyAgent::mHeader [private] |
syntax description of header lines
Referenced by otherCommand(), and writeFile().
YCPValue AnyAgent::mName [private] |
name of system file or program
Referenced by evalArg(), otherCommand(), Read(), readFile(), and Write().
bool AnyAgent::mReadOnly [private] |
true if file is read-only
Referenced by otherCommand(), parseData(), and Write().
YCPValue AnyAgent::mSyntax [private] |
syntax description of system file
Referenced by Dir(), otherCommand(), Read(), validateCache(), and Write().
time_t AnyAgent::mtime [private] |
file cache mtime = file's mtime when alldata was filled cache = parsed file alldata = list of YCPStringRep with all data from file
Referenced by readFile().
enum { ... } AnyAgent::mType [private] |
type of mName
Referenced by otherCommand(), and readFile().
bool AnyAgent::tupleContinue [private] |
Referenced by parseData(), parseTuple(), and unparseData().
stack<string> AnyAgent::tupleName [private] |
tuple parsing
Referenced by parseData(), parseTuple(), and unparseData().
stack<YCPValue> AnyAgent::tupleValue [private] |
Referenced by parseData(), parseTuple(), and unparseData().