#include <OverviewFmt.h>
Public Member Functions | |
| OverviewFmt () | |
| string | getfield (const char *over, const char *fld, int full=-1) |
| void | readxoin (std::istream &is) |
| void | convert (const string &recin, string &recout) const |
| void | convert (const Article &article, string &recout) const |
Public Attributes | |
| int | dotrans |
Private Attributes | |
| overdesc | _over [128] |
| transtab | _trans [128] |
| int | _osz |
Friends | |
| std::ostream & | operator<< (std::ostream &os, OverviewFmt &o) |
Definition at line 36 of file OverviewFmt.h.
|
|
Definition at line 62 of file OverviewFmt.h. References _osz, _over, CONF_OverviewFmt, dotrans, and OverviewFmt::overdesc::name.
00062 {
00063 const char *tmp[] = CONF_OverviewFmt, *q;
00064 char *p;
00065 for (_osz = 0; tmp[_osz]; _osz++) {
00066 p = _over[_osz].name;
00067 q = tmp[_osz];
00068 while ((*p++ = *q++) != ':');
00069 *p = '\0';
00070 _over[_osz].len = p - _over[_osz].name;
00071 _over[_osz].full = (*q == 'f') ? 1 : 0;
00072 } dotrans = 0;
00073 }
|
|
||||||||||||
|
Definition at line 209 of file OverviewFmt.h. References _osz, _over, Article::getnbr(), and Article::length().
00209 {
00210 char buf[256];
00211 string fld;
00212 int i;
00213
00214 sprintf(buf, "%d", article.getnbr());
00215 recout = buf;
00216 for (i = 0; i < _osz; i++) {
00217 recout += '\t';
00218 try {
00219 recout.append(article.
00220 getfield(_over[i].name,
00221 _over[i].full));
00222 }
00223 catch(NoSuchFieldError & nf) {
00224 // Check, whether field==bytes:
00225 if (strcasecmp(_over[i].name, "bytes:") ==
00226 0) {
00227 sprintf(buf, "%d",
00228 article.length());
00229 recout.append(buf);
00230 }
00231 // Field not found => empty
00232 }
00233 }
00234 }
|
|
||||||||||||
|
Convert from server overview format to local overview format if necessary.
Definition at line 136 of file OverviewFmt.h. References _osz, _over, _trans, dotrans, OverviewFmt::overdesc::full, OverviewFmt::overdesc::name, and OverviewFmt::transtab::trans. Referenced by checkConvertArtOver(), checkConvertOverOver(), NVNewsgroup::getover(), RNewsgroup::readoverdb(), NVNewsgroup::readoverdb(), NVNewsgroup::setarticle(), and NVNewsgroup::sprintover().
00136 {
00137 int tabs[256];
00138 int i, j, k, rinsz;
00139 if (!dotrans) {
00140 recout = recin;
00141 return;
00142 }
00143
00144 i = 0;
00145 rinsz = 0;
00146 j = recin.length();
00147 do {
00148 if (recin[i] == '\t')
00149 tabs[rinsz++] = i;
00150 i++;
00151 } while (i < j);
00152 tabs[rinsz] = i;
00153
00154 recout = recin.substr(0, tabs[0]);
00155 for (i = 0; i < _osz; i++) {
00156 j = _trans[i].trans;
00157 if (j >= rinsz) {
00158 // FIXME! recin has fewer values than it should have
00159 // FIXME! Is this an error?
00160 // FIXME! Assuming that the missing ones are empty
00161 recout += '\t';
00162 } else if (j >= 0) {
00163 if (_trans[i].full == _over[i].full) {
00164 // Leave field as is
00165 recout +=
00166 recin.substr(tabs[j],
00167 tabs[j + 1] -
00168 tabs[j]);
00169 } else if (_trans[i].full > _over[i].full) {
00170 // Strip fieldname from field
00171 k = tabs[j];
00172 while (recin[k] != ':'
00173 && k < tabs[j + 1])
00174 k++;
00175 if (recin[k] != ':') {
00176 // Cannot find fieldname -- leave it as it is
00177 recout +=
00178 recin.substr(tabs[j],
00179 tabs[j +
00180 1] -
00181 tabs[j]);
00182 } else {
00183 while (isspace(recin[k])
00184 && k < tabs[j + 1])
00185 k++;
00186 recout += '\t';
00187 recout +=
00188 recin.substr(k,
00189 tabs[j +
00190 1] -
00191 k);
00192 }
00193 } else {
00194 // Add fieldname to field
00195 recout += '\t';
00196 recout += _over[i].name;
00197 recout += ' ';
00198 recout +=
00199 recin.substr(tabs[j] + 1,
00200 tabs[j + 1] -
00201 tabs[j] - 1);
00202 }
00203 } else {
00204 recout += '\t';
00205 }
00206 }
00207 }
|
|
||||||||||||||||
|
Return a field of the overview database.
Definition at line 84 of file OverviewFmt.h. References _osz, _over, ERROR_LOCATION, and OverviewFmt::overdesc::full. Referenced by ns_lastnext(), ns_stat(), and NVNewsgroup::printheaderdb().
00084 {
00085 string field;
00086 int i;
00087
00088 for (i = 0; i < _osz; i++) {
00089 if (strcasecmp(fld, _over[i].name) == 0) {
00090 int j = i + 1;
00091 const char *p = over, *q;
00092
00093 while (*p && j) {
00094 if (*p++ == '\t')
00095 j--;
00096 }
00097 q = p;
00098 while (*q && *q != '\t')
00099 q++;
00100 if (full == -1 || full == _over[i].full) {
00101 // No fieldname needs to be added/stripped
00102 field.assign(p, q - p);
00103 return field;
00104 }
00105 if (full < _over[i].full) {
00106 // Strip fieldname
00107 while (*p && *p != ':')
00108 p++;
00109 while (*p && isspace(*p))
00110 p++;
00111 field.assign(p, q - p);
00112 return field;
00113 }
00114 // Add fieldname
00115 field = _over[i].name;
00116 field += ' ';
00117 field.append(p, q - p);
00118 return field;
00119 }
00120 }
00121 throw NoSuchFieldError(fld, ERROR_LOCATION);
00122 }
|
|
|
Read overview format and set up conversion table.
Definition at line 5 of file OverviewFmt.cc. References _osz, _over, _trans, dotrans, OverviewFmt::overdesc::full, OverviewFmt::transtab::full, OverviewFmt::overdesc::len, OverviewFmt::overdesc::name, nlreadline(), and OverviewFmt::transtab::trans. Referenced by checkConvertOverOver(), and RServer::connect().
00006 {
00007 string field;
00008 int fn = 0, i;
00009
00010 for (i = 0; i < _osz; i++) {
00011 _trans[i].trans = -1;
00012 }
00013
00014 for (;;) {
00015 nlreadline(is, field, 0);
00016 if (field == "." || is.eof())
00017 break;
00018 for (i = 0; i < _osz; i++) {
00019 if (field.length() >= (unsigned int) _over[i].len
00020 && strncasecmp(field.data(), _over[i].name,
00021 _over[i].len) == 0) {
00022 if (field.length() ==
00023 (unsigned int) _over[i].len + 4
00024 && strncasecmp("full",
00025 field.data() +
00026 _over[i].len, 4) == 0) {
00027 _trans[i].full = 1;
00028 } else {
00029 _trans[i].full = 0;
00030 }
00031 _trans[i].trans = fn;
00032 }
00033 }
00034 fn++;
00035 }
00036 dotrans = 0;
00037 if (_osz != fn) {
00038 dotrans = 1;
00039 } else {
00040 for (i = 0; i < _osz; i++) {
00041 if (_trans[i].trans != i
00042 || _trans[i].full != _over[i].full) {
00043 dotrans = 1;
00044 break;
00045 }
00046 }
00047 }
00048 }
|
|
||||||||||||
|
Definition at line 236 of file OverviewFmt.h.
|
|
|
Definition at line 58 of file OverviewFmt.h. Referenced by convert(), getfield(), OverviewFmt(), and readxoin(). |
|
|
Definition at line 56 of file OverviewFmt.h. Referenced by convert(), getfield(), OverviewFmt(), and readxoin(). |
|
|
Definition at line 57 of file OverviewFmt.h. Referenced by convert(), and readxoin(). |
|
|
Definition at line 61 of file OverviewFmt.h. Referenced by convert(), OverviewFmt(), RNewsgroup::readoverdb(), NVNewsgroup::readoverdb(), and readxoin(). |
1.3.6-20040222