00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "process.h"
00022
00023 namespace SaX {
00024
00025
00026
00027 SaXProcess::SaXProcess ( void ) {
00028
00034
00035 mProc = new SaXProcessCall ();
00036 }
00037
00038
00039
00040
00041 void SaXProcess::start ( QList<char> args, int prog ) {
00042
00047
00048 switch (prog) {
00049 case SAX_ISAX:
00050 mProc -> addArgument ( ISAX );
00051 break;
00052 case SAX_SYSP:
00053 mProc -> addArgument ( SYSP );
00054 break;
00055 case SAX_PROF:
00056 mProc -> addArgument ( PROF );
00057 break;
00058 case SAX_META:
00059 mProc -> addArgument ( META );
00060 break;
00061 default:
00062 mProc -> addArgument ( ISAX );
00063 break;
00064 }
00065 QListIterator<char> it (args);
00066 for (; it.current(); ++it) {
00067 mProc->addArgument ( it.current() );
00068 }
00069 if ( ! mProc -> start() ) {
00070 excProcessFailed();
00071 qError (errorString(),EXC_PROCESSFAILED);
00072 }
00073 switch (prog) {
00074 case SAX_ISAX:
00075 storeData();
00076 break;
00077 case SAX_SYSP:
00078 storeDataSysp();
00079 break;
00080 case SAX_PROF:
00081 storeData();
00082 break;
00083 case SAX_META:
00084 storeData();
00085 break;
00086 default:
00087 storeData();
00088 break;
00089 }
00090 }
00091
00092
00093
00094
00095 void SaXProcess::start ( int fileID ) {
00096
00100
00101 switch (fileID) {
00102 case CDB_CARDMODULES:
00103 storeDataSYS (fileID);
00104 break;
00105 case CDB_TABLETMODULES:
00106 storeDataSYS (fileID);
00107 break;
00108 default:
00109 storeDataCDB (fileID);
00110 break;
00111 }
00112 }
00113
00114
00115
00116
00117 void SaXProcess::storeDataCDB (int fileID) {
00118
00122
00123 QString file;
00124 switch (fileID) {
00125 case CDB_CARDS:
00126 file = CDBCARDS;
00127 break;
00128 case CDB_MONITORS:
00129 file = CDBMONITORS;
00130 break;
00131 case CDB_PENS:
00132 file = CDBPENS;
00133 break;
00134 case CDB_POINTERS:
00135 file = CDBPOINTERS;
00136 break;
00137 case CDB_TABLETS:
00138 file = CDBTABLETS;
00139 break;
00140 case CDB_TOUCHERS:
00141 file = CDBTOUCHERS;
00142 break;
00143 default:
00144 excCDBFileFailed ();
00145 qError (errorString(),EXC_CDBFILEFAILED);
00146 break;
00147 }
00148
00149
00150
00151 DIR* CDBDir = 0;
00152 struct dirent* entry = 0;
00153 CDBDir = opendir (CDBDIR);
00154 QList<QString> fileList;
00155 if (! CDBDir) {
00156 excFileOpenFailed ( errno );
00157 qError (errorString(),EXC_FILEOPENFAILED);
00158 return;
00159 }
00160 while (1) {
00161 entry = readdir (CDBDir);
00162 if (! entry) {
00163 break;
00164 }
00165 QString* updateFile = new QString();
00166 QTextOStream (updateFile) << CDBDIR << entry->d_name;
00167 if (*updateFile == file) {
00168 continue;
00169 }
00170 if ((updateFile->contains(file)) && (entry->d_type != DT_DIR)) {
00171 fileList.append (updateFile);
00172 }
00173 }
00174 closedir (CDBDir);
00175 fileList.append (&file);
00176 QListIterator<QString> it (fileList);
00177
00178
00179
00180
00181 for (; it.current(); ++it) {
00182 QFile* handle = new QFile (it.current()->ascii());
00183 if (! handle -> open(IO_ReadOnly)) {
00184 excFileOpenFailed ( errno );
00185 qError (errorString(),EXC_FILEOPENFAILED);
00186 return;
00187 }
00188 QString line;
00189 QString group,key,val;
00190 while ((handle->readLine (line,MAX_LINE_LENGTH)) != 0) {
00191 line.truncate(line.length()-1);
00192 if ((line[0] == '#') || (line.isEmpty())) {
00193 if (handle->atEnd()) {
00194 break;
00195 }
00196 continue;
00197 }
00198 int bp = line.find('{');
00199 if (bp >= 0) {
00200 QStringList tokens = QStringList::split ( ":", line );
00201 QString vendor = tokens.first();
00202 QString name = tokens.last();
00203 name.truncate(
00204 name.find('{')
00205 );
00206 name = name.stripWhiteSpace();
00207 vendor = vendor.stripWhiteSpace();
00208 group = vendor+":"+name;
00209 } else {
00210 bp = line.find('}');
00211 if (bp >= 0) {
00212 continue;
00213 }
00214 QStringList tokens = QStringList::split ( "=", line );
00215 key = tokens.first();
00216 val = tokens.last();
00217 val = val.stripWhiteSpace();
00218 key = key.stripWhiteSpace();
00219
00220
00221
00222
00223 if (key == "Hsync") {
00224 key = "HorizSync";
00225 }
00226 if (key == "Vsync") {
00227 key = "VertRefresh";
00228 }
00229 if (key == "Modeline") {
00230 key = "SpecialModeline";
00231 }
00232 addGroup (group,key,val);
00233 }
00234 if (handle->atEnd()) {
00235 break;
00236 }
00237 }
00238 handle -> close();
00239 }
00240 }
00241
00242
00243
00244
00245 void SaXProcess::storeDataSYS (int fileID) {
00246
00250
00251 QString file;
00252 switch (fileID) {
00253 case CDB_CARDMODULES:
00254 file = CDBCARDMODULES;
00255 break;
00256 case CDB_TABLETMODULES:
00257 file = CDBTABLETMODULES;
00258 break;
00259 default:
00260 excCDBFileFailed ();
00261 qError (errorString(),EXC_CDBFILEFAILED);
00262 break;
00263 }
00264 QFile* handle = new QFile (file);
00265 if (! handle -> open(IO_ReadOnly)) {
00266 excFileOpenFailed ( errno );
00267 qError (errorString(),EXC_FILEOPENFAILED);
00268 return;
00269 }
00270 QString line;
00271 QString group,key,val;
00272 while ((handle->readLine (line,MAX_LINE_LENGTH)) != 0) {
00273 line.truncate(line.length()-1);
00274 if ((line[0] == '#') || (line.isEmpty())) {
00275 if (handle->atEnd()) {
00276 break;
00277 }
00278 continue;
00279 }
00280 QStringList tokens = QStringList::split ( "=", line );
00281 group = tokens.first();
00282 if (group.contains("Format:(")) {
00283 continue;
00284 }
00285 tokens = QStringList::split ( " ", tokens.last() );
00286 for (QStringList::Iterator it=tokens.begin(); it!=tokens.end();++ it) {
00287 QString value (*it);
00288 QStringList tokens = QStringList::split ( ":", value );
00289 key = tokens.first();
00290 val = tokens.last();
00291 addGroup (group,key,val);
00292 }
00293 if (handle->atEnd()) {
00294 break;
00295 }
00296 }
00297 handle -> close();
00298 }
00299
00300
00301
00302
00303 void SaXProcess::storeDataSysp (void) {
00304
00307
00308 QList<QString> data = mProc->readStdout();
00309 QListIterator<QString> in (data);
00310 for (; in.current(); ++in) {
00311 int id = 0;
00312 QString line (*in.current());
00313 QStringList tokens = QStringList::split ( "=>", line );
00314 QString idstr = tokens.first();
00315 QString data = tokens.last();
00316 QStringList datalist = QStringList::split ( ":", data );
00317 QString key = datalist.first();
00318 QString val = datalist.last();
00319 QRegExp idExp ("(\\d+)");
00320 int rpos = idExp.search (idstr,0);
00321 if (rpos >= 0) {
00322 id = idExp.cap().toInt();
00323 }
00324 addID (id);
00325 val = val.stripWhiteSpace();
00326 key = key.stripWhiteSpace();
00327 if ((! key.isEmpty()) && (! val.isEmpty())) {
00328 setItem (key,val);
00329 }
00330 }
00331 }
00332
00333
00334
00335
00336 void SaXProcess::storeData (void) {
00337
00340
00341 QList<QString> data = mProc->readStdout();
00342 QListIterator<QString> in (data);
00343 for (; in.current(); ++in) {
00344 QString line (*in.current());
00345 QString cnr;
00346 QString key;
00347 QString val;
00348 int index = 0;
00349 QStringList tokens = QStringList::split ( ":", line );
00350 for ( QStringList::Iterator
00351 in = tokens.begin(); in != tokens.end(); ++in
00352 ) {
00353 QString item (*in);
00354 item = item.stripWhiteSpace();
00355 switch (index) {
00356 case 0:
00357 cnr = item;
00358 break;
00359 case 1:
00360 key = item;
00361 break;
00362 case 2:
00363 val = item;
00364 break;
00365 default:
00366 bool isNumber = false;
00367 if ((key == "Screen") || (key == "Relative")) {
00368 QRegExp idExp ("^(\\d+)$");
00369 if (idExp.search (val,0) >= 0) {
00370 isNumber=true;
00371 }
00372 }
00373 if (
00374 (((key == "Screen") || (key == "Relative")) &&
00375 (!isNumber)) || (key == "Modes")||(key == "Virtual")
00376 ) {
00377 key = key+":"+val;
00378 val = item;
00379 } else {
00380 val = val+":"+item;
00381 }
00382 break;
00383 }
00384 index++;
00385 }
00386 if (val.isEmpty()) {
00387 continue;
00388 }
00389 addID (cnr.toInt());
00390 setItem (key,val);
00391 }
00392 }
00393 }