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