diff options
Diffstat (limited to 'src/pedro/pedroconfig.cpp')
| -rw-r--r-- | src/pedro/pedroconfig.cpp | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/src/pedro/pedroconfig.cpp b/src/pedro/pedroconfig.cpp new file mode 100644 index 000000000..1197a6f1f --- /dev/null +++ b/src/pedro/pedroconfig.cpp @@ -0,0 +1,230 @@ +/* + * Implementation the Pedro mini-XMPP client + * + * Authors: + * Bob Jamison + * + * Copyright (C) 2005-2006 Bob Jamison + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +/* +==================================================== +We are expecting an xml file with this format: + +<pedro> + + <!-- zero to many of these --> + <account> + <name>Jabber's Main Server</name> + <host>jabber.org</host> + <port>5222</port> + <username>myname</username> + <password>mypassword</password> + </account> + +</pedro> + + +==================================================== +*/ + + + +#include "pedroconfig.h" +#include "pedrodom.h" + +#include <stdio.h> + +namespace Pedro +{ + + +static long getInt(const DOMString &s) +{ + char *start = (char *) s.c_str(); + char *end; + long val = strtol(start, &end, 10); + if (end == start) // did we read more than 1 digit? + val = 0L; + return val; +} + + + +bool XmppConfig::read(const DOMString &buffer) +{ + Parser parser; + + Element *root = parser.parse(buffer); + + if (!root) + { + error("Error in configuration syntax"); + return false; + } + + accounts.clear(); + + std::vector<Element *> accountElems = root->findElements("account"); + + for (unsigned int i=0 ; i<accountElems .size() ; i++) + { + XmppAccount account; + Element *elem = accountElems [i]; + + DOMString str = elem ->getTagValue("name"); + if (str.size()==0) + str = "unnamed account"; + account.setName(str); + + str = elem->getTagValue("host"); + if (str.size()==0) + str = "jabber.org"; + account.setName(str); + + str = elem->getTagValue("port"); + int port = (int) getInt(str); + if (port == 0) + port = 5222; + account.setPort(port); + + str = elem->getTagValue("username"); + if (str.size()==0) + str = "noname"; + account.setUsername(str); + + str = elem->getTagValue("password"); + if (str.size()==0) + str = "nopass"; + account.setPassword(str); + + accounts.push_back(account); + } + + + delete root; + + return true; +} + + + + + + +bool XmppConfig::readFile(const DOMString &fileName) +{ + + FILE *f = fopen(fileName.c_str(), "rb"); + if (!f) + { + error("Could not open configuration file '%s' for reading", + fileName.c_str()); + return false; + } + + DOMString buffer; + while (!feof(f)) + { + char ch = (char) fgetc(f); + buffer.push_back(ch); + } + fclose(f); + + if (!read(buffer)) + return false; + + return true; +} + + +DOMString XmppConfig::toXmlBuffer() +{ + + DOMString buf; + + char fmtbuf[32]; + + buf.append("<pedro>\n"); + + for (unsigned int i = 0 ; i<accounts.size() ; i++) + { + XmppAccount acc = accounts[i]; + buf.append(" <account>\n"); + buf.append(" <name>"); + buf.append(acc.getName()); + buf.append("</name>\n"); + buf.append(" <host>"); + buf.append(acc.getHost()); + buf.append("</host>\n"); + buf.append(" <port>"); + snprintf(fmtbuf, 31, "%d", acc.getPort()); + buf.append(fmtbuf); + buf.append("</port>\n"); + buf.append(" <username>"); + buf.append(acc.getUsername()); + buf.append("</username>\n"); + buf.append(" <password>"); + buf.append(acc.getPassword()); + buf.append("</password>\n"); + buf.append(" </account>\n"); + } + + buf.append("</pedro>\n"); + + return buf; +} + + + + +bool XmppConfig::writeFile(const DOMString &fileName) +{ + + FILE *f = fopen(fileName.c_str(), "wb"); + if (!f) + { + error("Could not open configuration file '%s' for writing", + fileName.c_str()); + return false; + } + + DOMString buffer = toXmlBuffer(); + char *s = (char *)buffer.c_str(); + size_t len = (size_t) strlen(s); //in case we have wide chars + + if (fwrite(s, 1, len, f) != len) + { + return false; + } + fclose(f); + + if (!read(buffer)) + return false; + + return true; +} + + + + + +} //namespace Pedro +//######################################################################## +//# E N D O F F I L E +//######################################################################## |
