|
libsax 7.2
|
00001 /************** 00002 FILE : process.cpp 00003 *************** 00004 PROJECT : SaX2 - library interface 00005 : 00006 AUTHOR : Marcus Schäfer <ms@suse.de> 00007 : 00008 BELONGS TO : SaX2 - SuSE advanced X11 configuration 00009 : 00010 : 00011 DESCRIPTION : native C++ class library to access SaX2 00012 : functionality. Easy to use interface for 00013 : //.../ 00014 : - importing/exporting X11 configurations 00015 : - modifying/creating X11 configurations 00016 : --- 00017 : 00018 : 00019 STATUS : Status: Development 00020 **************/ 00021 #include "process.h" 00022 00023 namespace SaX { 00024 //==================================== 00025 // Constructor... 00026 //------------------------------------ 00027 SaXProcess::SaXProcess ( void ) { 00028 // .../ 00034 // ---- 00035 mProc = new SaXProcessCall (); 00036 } 00037 00038 //==================================== 00039 // start... 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 // start... 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 // storeDataCDB... 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 // search all entries for file 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 // read in file list 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 // CDB keys and ISAX keys are not the same, 00225 // check this and adapt to ISAX keys 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 // storeDataSYS... 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 // storeDataSysp... 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 // QString line (in); 00319 if (line.isEmpty()) { 00320 continue; 00321 } 00322 QStringList tokens = QStringList::split ( "=>", line ); 00323 QString idstr = tokens.first(); 00324 QString data = tokens.last(); 00325 QStringList datalist = QStringList::split ( ":", data ); 00326 QString key = datalist.first(); 00327 QString val = datalist.last(); 00328 QRegExp idExp ("(\\d+)"); 00329 int rpos = idExp.search (idstr,0); 00330 if (rpos >= 0) { 00331 id = idExp.cap().toInt(); 00332 } 00333 addID (id); 00334 val = val.stripWhiteSpace(); 00335 key = key.stripWhiteSpace(); 00336 //printf ("+++ %s %s\n",key.toLatin1().data(),val.toLatin1().data()); 00337 if (key == "Vesa") { 00338 vesa.append (val); 00339 vesa.append (","); 00340 } else 00341 if (key == "Vesa[2]") { 00342 vesa2.append (val); 00343 vesa2.append (","); 00344 } else 00345 if (key == "FBBoot") { 00346 fbboot.append (val); 00347 fbboot.append (","); 00348 } else 00349 if ((! key.isEmpty()) && (! val.isEmpty())) { 00350 setItem (key,val); 00351 } 00352 } 00353 if (! vesa.isEmpty()) { 00354 vesa.replace (QRegExp(",$"),""); 00355 setItem ("Vesa",vesa); 00356 } 00357 if (! vesa2.isEmpty()) { 00358 vesa2.replace (QRegExp(",$"),""); 00359 setItem ("Vesa[2]",vesa2); 00360 } 00361 if (! fbboot.isEmpty()) { 00362 fbboot.replace (QRegExp(",$"),""); 00363 setItem ("FBBoot",fbboot); 00364 } 00365 } 00366 00367 //==================================== 00368 // storeData... 00369 //------------------------------------ 00370 void SaXProcess::storeData (void) { 00371 // .../ 00374 // ---- 00375 QList<QString> data = mProc->readStdout(); 00376 QString line; 00377 foreach (line,data) { 00378 // QString line (*in.current()); 00379 QString cnr; 00380 QString key; 00381 QString val; 00382 int index = 0; 00383 QStringList tokens = QStringList::split ( ":", line ); 00384 for ( QStringList::Iterator 00385 in = tokens.begin(); in != tokens.end(); ++in 00386 ) { 00387 QString item (*in); 00388 item = item.stripWhiteSpace(); 00389 switch (index) { 00390 case 0: 00391 cnr = item; 00392 break; 00393 case 1: 00394 key = item; 00395 break; 00396 case 2: 00397 val = item; 00398 break; 00399 default: 00400 bool isNumber = false; 00401 if ((key == "Screen") || (key == "Relative")) { 00402 QRegExp idExp ("^(\\d+)$"); 00403 if (idExp.search (val,0) >= 0) { 00404 isNumber=true; 00405 } 00406 } 00407 if ( 00408 (((key == "Screen") || (key == "Relative")) && 00409 (!isNumber)) || (key == "Modes")||(key == "Virtual") 00410 ) { 00411 key = key+":"+val; 00412 val = item; 00413 } else { 00414 val = val+":"+item; 00415 } 00416 break; 00417 } 00418 index++; 00419 } 00420 if (val.isEmpty()) { 00421 continue; 00422 } 00423 addID (cnr.toInt()); 00424 setItem (key,val); 00425 } 00426 } 00427 } // end namespace
1.7.3