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

OverviewFmt Class Reference

#include <OverviewFmt.h>

List of all members.

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)


Detailed Description

Author:
Thomas Gschwind

Definition at line 36 of file OverviewFmt.h.


Constructor & Destructor Documentation

OverviewFmt::OverviewFmt  )  [inline]
 

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         }


Member Function Documentation

void OverviewFmt::convert const Article article,
string &  recout
const [inline]
 

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         }

void OverviewFmt::convert const string &  recin,
string &  recout
const [inline]
 

Convert from server overview format to local overview format if necessary.

Parameters:
recin The overview record that has to be converted.
recout The converted overview record.

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         }

string OverviewFmt::getfield const char *  over,
const char *  fld,
int  full = -1
[inline]
 

Return a field of the overview database.

Parameters:
over An overview record.
fld The name of the field to be extracted.
full 
  • -1 => do not strip/add fieldname
  • 0 => strip fieldname
  • 1 => add fieldname

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         }

void OverviewFmt::readxoin std::istream &  is  ) 
 

Read overview format and set up conversion table.

Parameters:
is Input stream where the overview database is read from.

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 }


Friends And Related Function Documentation

std::ostream& operator<< std::ostream &  os,
OverviewFmt o
[friend]
 

Definition at line 236 of file OverviewFmt.h.

00237                                                            {
00238                 int i;
00239                 for (i = 0; i < o._osz; i++) {
00240                         os << o._over[i].name;
00241                         if (o._over[i].full)
00242                                 os << "full\r\n";
00243                         else
00244                                 os << "\r\n";
00245                 }
00246                 return os;
00247         }


Member Data Documentation

int OverviewFmt::_osz [private]
 

Definition at line 58 of file OverviewFmt.h.

Referenced by convert(), getfield(), OverviewFmt(), and readxoin().

overdesc OverviewFmt::_over[128] [private]
 

Definition at line 56 of file OverviewFmt.h.

Referenced by convert(), getfield(), OverviewFmt(), and readxoin().

transtab OverviewFmt::_trans[128] [private]
 

Definition at line 57 of file OverviewFmt.h.

Referenced by convert(), and readxoin().

int OverviewFmt::dotrans
 

Definition at line 61 of file OverviewFmt.h.

Referenced by convert(), OverviewFmt(), RNewsgroup::readoverdb(), NVNewsgroup::readoverdb(), and readxoin().


The documentation for this class was generated from the following files:
Generated on Fri Aug 20 10:58:12 2004 for NewsCache by doxygen 1.3.6-20040222