00001 #include "util.h"
00002 #include "MPList.h"
00003
00004
00005
00006
00007 using namespace std;
00008
00009 MPListEntry *MPList::postserver(const char *group)
00010 {
00011 unsigned int i;
00012
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
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 }