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<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 // 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         QListIterator<QString> it (fileList);
00180 
00181         //====================================
00182         // read in file list
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                                 // CDB keys and ISAX keys are not the same,
00224                                 // check this and adapt to ISAX keys
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 // storeDataSYS...
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 // storeDataSysp...
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 // storeData...
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 } // end namespace

Generated on Tue Sep 25 20:18:16 2007 for libsax by  doxygen 1.5.3