Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

MPList.cc

Go to the documentation of this file.
00001 #include "util.h"
00002 #include "MPList.h"
00003 
00004 //#include <vector>
00005 //#include <algorithm>
00006 
00007 using namespace std;
00008 
00009 MPListEntry *MPList::postserver(const char *group)
00010 {
00011         unsigned int i;
00012         // bm=Best Match
00013         int bm = -1, bmlen = 0, clen;
00014 
00015         for (i = 0; i < entries.size(); i++) {
00016                 clen = matchgroup(entries[i].postTo, group);
00017                 if (clen > bmlen) {
00018                         bm = i;
00019                         bmlen = clen;
00020                 }
00021         }
00022         if (bm >= 0 && entries[bm].hostname[0] != '\0')
00023                 return &(entries[bm]);
00024         return NULL;
00025 }
00026 
00027 MPListEntry *MPList::server(const char *group)
00028 {
00029         unsigned int i;
00030         // bm=Best Match
00031         int bm = -1, bmlen = 0, clen;
00032 
00033         for (i = 0; i < entries.size(); i++) {
00034                 clen = matchgroup(entries[i].read, group);
00035                 if (clen > bmlen) {
00036                         bm = i;
00037                         bmlen = clen;
00038                 }
00039         }
00040         if (bm >= 0 && entries[bm].hostname[0] != '\0')
00041                 return &(entries[bm]);
00042         return NULL;
00043 }
00044 
00045 void MPListEntry::printParameters (ostream *pOut)
00046 {
00047         if (hostname[0] != '\0') {
00048                 *pOut << "\tServer " << hostname << " " << servicename
00049                         << " {" << endl;
00050         } else {
00051                 *pOut << "\tNoServer " << " {" << endl;
00052         }
00053         if (user[0] != '\0') {
00054                 *pOut << "\t\tUser " << user << endl;
00055         }
00056         if (passwd[0] != '\0') {
00057                 *pOut << "\t\tPassword " << passwd << endl;
00058         }
00059         if (read[0] != '\0') {
00060                 *pOut << "\t\tRead "<< read << endl;
00061         }
00062         if (postTo[0] != '\0') {
00063                 *pOut << "\t\tPostTo " << postTo << endl;
00064         }
00065         if (bindFrom[0] != '\0') {
00066                 *pOut << "\t\tBindFrom " << bindFrom << endl;
00067         }
00068         *pOut << "\t\tGroupTimeout " << groupTimeout << endl;
00069         *pOut << "\t\tOptions";
00070         if (flags & F_SETPOSTFLAG) {
00071                 *pOut << " setpostflag";
00072         }
00073         if (flags & F_CACHED) {
00074                 *pOut << " cached";
00075         }
00076         if (flags & F_OFFLINE) {
00077                 *pOut << " offline";
00078         }
00079         if (flags & F_SEMIOFFLINE) {
00080                 *pOut << " semioffline";
00081         }
00082         *pOut << endl;
00083         if (~nntpflags) {
00084                 *pOut << "\t\tCommands";
00085                 if ((~nntpflags) & F_LIST_ACTIVE_WILDMAT) {
00086                         *pOut << " list_active_wildmat";
00087                 }
00088                 if ((~nntpflags) & F_LIST_OVERVIEW_FMT) {
00089                         *pOut << " list_overview_fmt";
00090                 }
00091                 if ((~nntpflags) & F_LISTGROUP) {
00092                         *pOut << " not-listgroup";
00093                 }
00094                 if ((~nntpflags) & F_MODE_READER) {
00095                         *pOut << " not-mode_reader";
00096                 }
00097                 if ((~nntpflags) & F_OVER) {
00098                         *pOut << " not-over";
00099                 }
00100                 if ((~nntpflags) & F_XOVER) {
00101                         *pOut << " not-xover";
00102                 }
00103                 if ((~nntpflags) & F_POST) {
00104                         *pOut << " not-post";
00105                 }
00106                 *pOut << endl;
00107         }
00108         *pOut << "\t\tRetries " << retries << endl;
00109         *pOut << "\t}" << endl;
00110 }
00111 
00112 void MPList::read(Lexer & lex)
00113 {
00114         string tok, host, port;
00115 
00116         tok = lex.getToken();
00117         if (tok != "{")
00118                 throw SyntaxError(lex, "expected '{'", ERROR_LOCATION);
00119         for (;;) {
00120                 tok = lex.getToken();
00121                 if (tok == "Server") {
00122                         host = lex.getToken();
00123                         port = lex.getToken();
00124                         readServer(lex, host.c_str(), port.c_str());
00125                 } else if (tok == "NoServer") {
00126                         readServer(lex, NULL, NULL);
00127                 } else if (tok == "}") {
00128                         break;
00129                 } else {
00130                         throw SyntaxError(lex,
00131                                           "expected declaration or '}'",
00132                                           ERROR_LOCATION);
00133                 }
00134         }
00135 }
00136 
00137 void MPList::readServer(Lexer & lex, const char *host, const char *port)
00138 {
00139         string tok, a1, a2, a3;
00140         int havePostTo = 0;
00141         MPListEntry cur;
00142 
00143         if (host) {
00144                 strcpy(cur.hostname, host);
00145                 strcpy(cur.servicename, port);
00146         }
00147 
00148         tok = lex.getToken();
00149         if (tok != "{")
00150                 throw SyntaxError(lex, "expected '{'", ERROR_LOCATION);
00151         for (;;) {
00152                 tok = lex.getToken();
00153                 if (tok == "Read") {
00154                         a1 = lex.getToken();
00155                         if (a1.length() >= sizeof(cur.read))
00156                                 throw SyntaxError(lex,
00157                                                   "group description too long",
00158                                                   ERROR_LOCATION);
00159                         strcpy(cur.read, a1.c_str());
00160                         if (!havePostTo) {
00161                                 if (a1.length() >= sizeof(cur.postTo))
00162                                         throw SyntaxError(lex,
00163                                                           "group description too long",
00164                                                           ERROR_LOCATION);
00165                                 strcpy(cur.postTo, a1.c_str());
00166                         }
00167                 } else if (tok == "BindFrom") {
00168                         a1 = lex.getToken();
00169                         if (a1.length() >= sizeof(cur.bindFrom))
00170                                 throw SyntaxError(lex,
00171                                                   "BindFrom field is too long",
00172                                                   ERROR_LOCATION);
00173                         strcpy(cur.bindFrom, a1.c_str());
00174                 } else if (tok == "PostTo") {
00175                         a1 = lex.getToken();
00176                         if (a1.length() >= sizeof(cur.postTo))
00177                                 throw SyntaxError(lex,
00178                                                   "group description too long",
00179                                                   ERROR_LOCATION);
00180                         strcpy(cur.postTo, a1.c_str());
00181                 } else if (tok == "GroupTimeout") {
00182                         a1 = lex.getToken();
00183                         cur.groupTimeout = atoi(a1.c_str());
00184                 } else if (tok == "Retries") {
00185                         a1 = lex.getToken();
00186                         cur.retries = atoi(a1.c_str());
00187                 } else if (tok == "User") {
00188                         a1 = lex.getToken();
00189                         strncpy(cur.user, a1.c_str(), 64);
00190                 } else if (tok == "Password") {
00191                         a1 = lex.getToken();
00192                         strncpy(cur.passwd, a1.c_str(), 64);
00193                 } else if (tok == "Options") {
00194                         int flag;
00195                         for (;;) {
00196                                 a1 = lex.getToken();
00197                                 if (lex.
00198                                     isFlag(a1.c_str(), "setpostflag",
00199                                            &flag)) {
00200                                         if (flag)
00201                                                 cur.flags |=
00202                                                     MPListEntry::
00203                                                     F_SETPOSTFLAG;
00204                                         else
00205                                                 cur.flags &=
00206                                                     ~MPListEntry::
00207                                                     F_SETPOSTFLAG;
00208                                 } else if (lex.
00209                                            isFlag(a1.c_str(), "cached",
00210                                                   &flag)) {
00211                                         if (flag)
00212                                                 cur.flags |=
00213                                                     MPListEntry::F_CACHED;
00214                                         else
00215                                                 cur.flags &=
00216                                                     ~MPListEntry::F_CACHED;
00217                                 } else if (lex.
00218                                            isFlag(a1.c_str(), "offline",
00219                                                   &flag)) {
00220                                         if (flag)
00221                                                 cur.flags |=
00222                                                     MPListEntry::F_OFFLINE;
00223                                         else
00224                                                 cur.flags &=
00225                                                     ~MPListEntry::
00226                                                     F_OFFLINE;
00227                                 } else if (a1 == "semioffline") {
00228                                         cur.flags |=
00229                                             MPListEntry::F_SEMIOFFLINE;
00230                                 } else {
00231                                         break;
00232                                 }
00233                         }
00234                         lex.putbackToken(a1);
00235                 } else if (tok == "Commands") {
00236                         int flag;
00237                         for (;;) {
00238                                 a1 = lex.getToken();
00239                                 if (lex.
00240                                     isFlag(a1.c_str(), "listgroup",
00241                                            &flag)) {
00242                                         if (flag)
00243                                                 cur.nntpflags |=
00244                                                     MPListEntry::
00245                                                     F_LISTGROUP;
00246                                         else
00247                                                 cur.nntpflags &=
00248                                                     ~MPListEntry::
00249                                                     F_LISTGROUP;
00250                                 } else if (lex.
00251                                            isFlag(a1.c_str(), "over",
00252                                                   &flag)) {
00253                                         if (flag)
00254                                                 cur.nntpflags |=
00255                                                     MPListEntry::F_OVER;
00256                                         else
00257                                                 cur.nntpflags &=
00258                                                     ~MPListEntry::F_OVER;
00259                                 } else {
00260                                         break;
00261                                 }
00262                         }
00263                         lex.putbackToken(a1);
00264                 } else if (tok == "}") {
00265                         break;
00266                 } else {
00267                         throw SyntaxError(lex,
00268                                           "expected declaration or '}'",
00269                                           ERROR_LOCATION);
00270                 }
00271         }
00272 
00273         entries.push_back(cur);
00274 }
00275 
00276 void MPList::printParameters (ostream *pOut)
00277 {
00278         vector<MPListEntry>::iterator begin, end;
00279 
00280         *pOut << "NewsServerList {" << endl;
00281         
00282         
00283         for (begin=entries.begin(), end=entries.end();
00284                         begin != end; begin++) {
00285                 begin->printParameters (pOut);
00286         }
00287 
00288         *pOut << "}" << endl;
00289 }

Generated on Fri Aug 20 10:58:06 2004 for NewsCache by doxygen 1.3.6-20040222