printcapreader.cpp00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "printcapreader.h"
00021 #include "printcapentry.h"
00022
00023 #include <qfile.h>
00024 #include <kdebug.h>
00025
00026 void PrintcapReader::setPrintcapFile(QFile *f)
00027 {
00028 if (f->isOpen())
00029 {
00030 m_stream.setDevice(f);
00031 m_buffer = QString::null;
00032 }
00033 }
00034
00035 bool PrintcapReader::nextLine(QString& line)
00036 {
00037 if (m_stream.atEnd() && m_buffer.isEmpty())
00038 return false;
00039 else if (!m_buffer.isEmpty())
00040 {
00041 line = m_buffer;
00042 m_buffer = QString::null;
00043 }
00044 else
00045 line = m_stream.readLine().stripWhiteSpace();
00046
00047 if (line[line.length()-1] == '\\')
00048 line = line.left(line.length()-1).stripWhiteSpace();
00049 return true;
00050 }
00051
00052 void PrintcapReader::unputLine(const QString& s)
00053 {
00054 m_buffer = s;
00055 }
00056
00057 PrintcapEntry* PrintcapReader::nextEntry()
00058 {
00059 if (!m_stream.device())
00060 return NULL;
00061
00062 QString line, comment, name, fields, buf;
00063
00064 while (1)
00065 {
00066 if (!nextLine(line))
00067 return NULL;
00068 else if (line.isEmpty())
00069 continue;
00070 else if (line[0] == '#')
00071 comment = line;
00072 else
00073 {
00074 buf = line;
00075 break;
00076 }
00077 }
00078
00079
00080 while (1)
00081 {
00082
00083
00084 if (!nextLine(line) || line.isEmpty())
00085 break;
00086
00087 else if (line[0] == '#')
00088 continue;
00089
00090 else if (line[0] == ':' || line[0] == '|')
00091 buf += line;
00092
00093
00094 else
00095 {
00096 unputLine(line);
00097 break;
00098 }
00099 }
00100
00101
00102 kdDebug() << "COMMENT: " << comment << endl;
00103 kdDebug() << "LINE: " << buf << endl;
00104 int p = buf.find(':');
00105 if (p == -1)
00106 name = buf;
00107 else
00108 {
00109 name = buf.left(p);
00110 fields = buf.right(buf.length()-p-1);
00111 }
00112
00113
00114 if (!name.isEmpty())
00115 {
00116 PrintcapEntry *entry = new PrintcapEntry;
00117 QStringList l = QStringList::split('|', name, false);
00118 entry->name = l[0];
00119 entry->comment = comment;
00120
00121
00122 for (uint i=1; i<l.count(); i++)
00123 {
00124 entry->aliases << l[i];
00125
00126 }
00127 if (!fields.isEmpty())
00128 {
00129
00130
00131 l = QStringList::split(':', fields, false);
00132 for (QStringList::ConstIterator it=l.begin(); it!=l.end(); ++it)
00133 {
00134 Field f;
00135 int p = (*it).find('=');
00136 if (p == -1)
00137 {
00138 p = (*it).find('#');
00139 if (p == -1)
00140 {
00141 f.type = Field::Boolean;
00142 p = (*it).find('@');
00143 if (p == -1)
00144 {
00145 f.name = (*it);
00146 f.value = "1";
00147 }
00148 else
00149 {
00150 f.name = (*it).left(p);
00151 f.value = "0";
00152 }
00153 }
00154 else
00155 {
00156 f.type = Field::Integer;
00157 f.name = (*it).left(p);
00158 f.value = (*it).mid(p+1);
00159 }
00160 }
00161 else
00162 {
00163 f.type = Field::String;
00164 f.name = (*it).left(p);
00165 f.value = (*it).mid(p+1);
00166 if (f.value.startsWith("\""))
00167 f.value = f.value.mid(1, f.value.length()-2);
00168 }
00169 entry->fields[f.name] = f;
00170 }
00171 }
00172
00173 return entry;
00174 }
00175 return NULL;
00176 }
|