libsax 7.2

process.cpp

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