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_PADS:
00135 file = CDBPADS;
00136 break;
00137 case CDB_POINTERS:
00138 file = CDBPOINTERS;
00139 break;
00140 case CDB_TABLETS:
00141 file = CDBTABLETS;
00142 break;
00143 case CDB_TOUCHERS:
00144 file = CDBTOUCHERS;
00145 break;
00146 default:
00147 excCDBFileFailed ();
00148 qError (errorString(),EXC_CDBFILEFAILED);
00149 break;
00150 }
00151
00152
00153
00154 DIR* CDBDir = 0;
00155 struct dirent* entry = 0;
00156 CDBDir = opendir (CDBDIR);
00157 QList<QString> fileList;
00158 if (! CDBDir) {
00159 excFileOpenFailed ( errno );
00160 qError (errorString(),EXC_FILEOPENFAILED);
00161 return;
00162 }
00163 while (1) {
00164 entry = readdir (CDBDir);
00165 if (! entry) {
00166 break;
00167 }
00168 QString* updateFile = new QString();
00169 QTextOStream (updateFile) << CDBDIR << entry->d_name;
00170 if (*updateFile == file) {
00171 continue;
00172 }
00173 if ((updateFile->contains(file)) && (entry->d_type != DT_DIR)) {
00174 fileList.append (updateFile);
00175 }
00176 }
00177 closedir (CDBDir);
00178 fileList.append (&file);
00179 QListIterator<QString> it (fileList);
00180
00181
00182
00183
00184 for (; it.current(); ++it) {
00185 QFile* handle = new QFile (it.current()->ascii());
00186 if (! handle -> open(IO_ReadOnly)) {
00187 excFileOpenFailed ( errno );
00188 qError (errorString(),EXC_FILEOPENFAILED);
00189 return;
00190 }
00191 QString line;
00192 QString group,key,val;
00193 while ((handle->readLine (line,MAX_LINE_LENGTH)) != 0) {
00194 line.truncate(line.length()-1);
00195 if ((line[0] == '#') || (line.isEmpty())) {
00196 if (handle->atEnd()) {
00197 break;
00198 }
00199 continue;
00200 }
00201 int bp = line.find('{');
00202 if (bp >= 0) {
00203 QStringList tokens = QStringList::split ( ":", line );
00204 QString vendor = tokens.first();
00205 QString name = tokens.last();
00206 name.truncate(
00207 name.find('{')
00208 );
00209 name = name.stripWhiteSpace();
00210 vendor = vendor.stripWhiteSpace();
00211 group = vendor+":"+name;
00212 } else {
00213 bp = line.find('}');
00214 if (bp >= 0) {
00215 continue;
00216 }
00217 QStringList tokens = QStringList::split ( "=", line );
00218 key = tokens.first();
00219 val = tokens.last();
00220 val = val.stripWhiteSpace();
00221 key = key.stripWhiteSpace();
00222
00223
00224
00225
00226 if (key == "Hsync") {
00227 key = "HorizSync";
00228 }
00229 if (key == "Vsync") {
00230 key = "VertRefresh";
00231 }
00232 if (key == "Modeline") {
00233 key = "SpecialModeline";
00234 }
00235 addGroup (group,key,val);
00236 }
00237 if (handle->atEnd()) {
00238 break;
00239 }
00240 }
00241 handle -> close();
00242 }
00243 }
00244
00245
00246
00247
00248 void SaXProcess::storeDataSYS (int fileID) {
00249
00253
00254 QString file;
00255 switch (fileID) {
00256 case CDB_CARDMODULES:
00257 file = CDBCARDMODULES;
00258 break;
00259 case CDB_TABLETMODULES:
00260 file = CDBTABLETMODULES;
00261 break;
00262 default:
00263 excCDBFileFailed ();
00264 qError (errorString(),EXC_CDBFILEFAILED);
00265 break;
00266 }
00267 QFile* handle = new QFile (file);
00268 if (! handle -> open(IO_ReadOnly)) {
00269 excFileOpenFailed ( errno );
00270 qError (errorString(),EXC_FILEOPENFAILED);
00271 return;
00272 }
00273 QString line;
00274 QString group,key,val;
00275 while ((handle->readLine (line,MAX_LINE_LENGTH)) != 0) {
00276 line.truncate(line.length()-1);
00277 if ((line[0] == '#') || (line.isEmpty())) {
00278 if (handle->atEnd()) {
00279 break;
00280 }
00281 continue;
00282 }
00283 QStringList tokens = QStringList::split ( "=", line );
00284 group = tokens.first();
00285 if (group.contains("Format:(")) {
00286 continue;
00287 }
00288 tokens = QStringList::split ( " ", tokens.last() );
00289 for (QStringList::Iterator it=tokens.begin(); it!=tokens.end();++ it) {
00290 QString value (*it);
00291 QStringList tokens = QStringList::split ( ":", value );
00292 key = tokens.first();
00293 val = tokens.last();
00294 addGroup (group,key,val);
00295 }
00296 if (handle->atEnd()) {
00297 break;
00298 }
00299 }
00300 handle -> close();
00301 }
00302
00303
00304
00305
00306 void SaXProcess::storeDataSysp (void) {
00307
00310
00311 QString vesa,vesa2,fbboot;
00312 QList<QString> data = mProc->readStdout();
00313 QListIterator<QString> in (data);
00314 for (; in.current(); ++in) {
00315 int id = 0;
00316 QString line (*in.current());
00317 QStringList tokens = QStringList::split ( "=>", line );
00318 QString idstr = tokens.first();
00319 QString data = tokens.last();
00320 QStringList datalist = QStringList::split ( ":", data );
00321 QString key = datalist.first();
00322 QString val = datalist.last();
00323 QRegExp idExp ("(\\d+)");
00324 int rpos = idExp.search (idstr,0);
00325 if (rpos >= 0) {
00326 id = idExp.cap().toInt();
00327 }
00328 addID (id);
00329 val = val.stripWhiteSpace();
00330 key = key.stripWhiteSpace();
00331 if (key == "Vesa") {
00332 vesa.append (val);
00333 vesa.append (",");
00334 } else
00335 if (key == "Vesa[2]") {
00336 vesa2.append (val);
00337 vesa2.append (",");
00338 } else
00339 if (key == "FBBoot") {
00340 fbboot.append (val);
00341 fbboot.append (",");
00342 } else
00343 if ((! key.isEmpty()) && (! val.isEmpty())) {
00344 setItem (key,val);
00345 }
00346 }
00347 if (! vesa.isEmpty()) {
00348 vesa.replace (QRegExp(",$"),"");
00349 setItem ("Vesa",vesa);
00350 }
00351 if (! vesa2.isEmpty()) {
00352 vesa2.replace (QRegExp(",$"),"");
00353 setItem ("Vesa[2]",vesa2);
00354 }
00355 if (! fbboot.isEmpty()) {
00356 fbboot.replace (QRegExp(",$"),"");
00357 setItem ("FBBoot",fbboot);
00358 }
00359 }
00360
00361
00362
00363
00364 void SaXProcess::storeData (void) {
00365
00368
00369 QList<QString> data = mProc->readStdout();
00370 QListIterator<QString> in (data);
00371 for (; in.current(); ++in) {
00372 QString line (*in.current());
00373 QString cnr;
00374 QString key;
00375 QString val;
00376 int index = 0;
00377 QStringList tokens = QStringList::split ( ":", line );
00378 for ( QStringList::Iterator
00379 in = tokens.begin(); in != tokens.end(); ++in
00380 ) {
00381 QString item (*in);
00382 item = item.stripWhiteSpace();
00383 switch (index) {
00384 case 0:
00385 cnr = item;
00386 break;
00387 case 1:
00388 key = item;
00389 break;
00390 case 2:
00391 val = item;
00392 break;
00393 default:
00394 bool isNumber = false;
00395 if ((key == "Screen") || (key == "Relative")) {
00396 QRegExp idExp ("^(\\d+)$");
00397 if (idExp.search (val,0) >= 0) {
00398 isNumber=true;
00399 }
00400 }
00401 if (
00402 (((key == "Screen") || (key == "Relative")) &&
00403 (!isNumber)) || (key == "Modes")||(key == "Virtual")
00404 ) {
00405 key = key+":"+val;
00406 val = item;
00407 } else {
00408 val = val+":"+item;
00409 }
00410 break;
00411 }
00412 index++;
00413 }
00414 if (val.isEmpty()) {
00415 continue;
00416 }
00417 addID (cnr.toInt());
00418 setItem (key,val);
00419 }
00420 }
00421 }