Main Page | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members

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                 default:
00059                         mProc -> addArgument ( ISAX );
00060                 break;
00061         }
00062         QListIterator<char> it (args);
00063         for (; it.current(); ++it) {
00064                 mProc->addArgument ( it.current() );
00065         }
00066         if ( ! mProc -> start() ) {
00067                 excProcessFailed();
00068                 qError (errorString(),EXC_PROCESSFAILED);
00069         }
00070         switch (prog) {
00071                 case SAX_ISAX:
00072                         storeData();
00073                 break;
00074                 case SAX_SYSP:
00075                         storeDataSysp();
00076                 break;
00077                 case SAX_PROF:
00078                         storeData();
00079                 break;
00080                 default:
00081                         storeData();
00082                 break;
00083         }
00084 }
00085 
00086 //====================================
00087 // start...
00088 //------------------------------------
00089 void SaXProcess::start ( int fileID ) {
00090         // .../
00094         // ----
00095         switch (fileID) {
00096                 case CDB_CARDMODULES:
00097                         storeDataSYS (fileID);
00098                 break;
00099                 case CDB_TABLETMODULES:
00100                         storeDataSYS (fileID);
00101                 break;
00102                 default:
00103                         storeDataCDB (fileID);
00104                 break;
00105         }
00106 }
00107 
00108 //====================================
00109 // storeDataCDB...
00110 //------------------------------------
00111 void SaXProcess::storeDataCDB (int fileID) {
00112         // .../
00116         // ----
00117         QString file;
00118         switch (fileID) {
00119                 case CDB_CARDS:
00120                         file = CDBCARDS;
00121                 break;
00122                 case CDB_MONITORS:
00123                         file = CDBMONITORS;
00124                 break;
00125                 case CDB_PENS:
00126                         file = CDBPENS;
00127                 break;
00128                 case CDB_POINTERS:
00129                         file = CDBPOINTERS;
00130                 break;
00131                 case CDB_TABLETS:
00132                         file = CDBTABLETS;
00133                 break;
00134                 case CDB_TOUCHERS:
00135                         file = CDBTOUCHERS;
00136                 break;
00137                 default:
00138                         excCDBFileFailed ();
00139                         qError (errorString(),EXC_CDBFILEFAILED);
00140                 break;
00141         }
00142         QFile* handle = new QFile (file);
00143         if (! handle -> open(IO_ReadOnly)) {
00144                 excFileOpenFailed ( errno );
00145                 qError (errorString(),EXC_FILEOPENFAILED);
00146                 return;
00147         }
00148         QString line;
00149         QString group,key,val;
00150         while ((handle->readLine (line,MAX_LINE_LENGTH)) != 0) {
00151                 line.truncate(line.length()-1);
00152                 if ((line[0] == '#') || (line.isEmpty())) {
00153                         if (handle->atEnd()) {
00154                                 break;
00155                         }
00156                         continue;
00157                 }
00158                 int bp = line.find('{');
00159                 if (bp >= 0) {
00160                         QStringList tokens = QStringList::split ( ":", line );
00161                         QString vendor = tokens.first();
00162                         QString name   = tokens.last();
00163                         name.truncate(
00164                                 name.find('{')
00165                         );
00166                         name   = name.stripWhiteSpace();
00167                         vendor = vendor.stripWhiteSpace();
00168                         group = vendor+":"+name;
00169                 } else {
00170                         bp = line.find('}');
00171                         if (bp >= 0) {
00172                                 continue;
00173                         }
00174                         QStringList tokens = QStringList::split ( "=", line );
00175                         key = tokens.first();
00176                         val = tokens.last();
00177                         val = val.stripWhiteSpace();
00178                         key = key.stripWhiteSpace();
00179                         // ... /
00180                         // CDB keys and ISAX keys are not the same,
00181                         // check this and adapt to ISAX keys
00182                         // ---
00183                         if (key == "Hsync") {
00184                                 key = "HorizSync";
00185                         }
00186                         if (key == "Vsync") {
00187                                 key = "VertRefresh";
00188                         }
00189                         if (key == "Modeline") {
00190                                 key = "SpecialModeline";
00191                         }
00192                         addGroup (group,key,val);
00193                 }
00194                 if (handle->atEnd()) {
00195                         break;
00196                 }
00197         }
00198         handle -> close();
00199 }
00200 
00201 //====================================
00202 // storeDataSYS...
00203 //------------------------------------
00204 void SaXProcess::storeDataSYS (int fileID) {
00205         // .../
00209         // ----
00210         QString file;
00211         switch (fileID) {
00212                 case CDB_CARDMODULES:
00213                         file = CDBCARDMODULES;
00214                 break;
00215                 case CDB_TABLETMODULES:
00216                         file = CDBTABLETMODULES;
00217                 break;
00218                 default:
00219                         excCDBFileFailed ();
00220                         qError (errorString(),EXC_CDBFILEFAILED);
00221                 break;
00222         }
00223         QFile* handle = new QFile (file);
00224         if (! handle -> open(IO_ReadOnly)) {
00225                 excFileOpenFailed ( errno );
00226                 qError (errorString(),EXC_FILEOPENFAILED);
00227                 return;
00228         }
00229         QString line;
00230         QString group,key,val;
00231         while ((handle->readLine (line,MAX_LINE_LENGTH)) != 0) {
00232                 line.truncate(line.length()-1);
00233                 if ((line[0] == '#') || (line.isEmpty())) {
00234                         if (handle->atEnd()) {
00235                                 break;
00236                         }
00237                         continue;
00238                 }
00239                 QStringList tokens = QStringList::split ( "=", line );
00240                 group  = tokens.first();
00241                 if (group.contains("Format:(")) {
00242                         continue;
00243                 }
00244                 tokens = QStringList::split ( " ", tokens.last() );
00245                 for (QStringList::Iterator it=tokens.begin(); it!=tokens.end();++ it) {
00246                         QString value (*it);
00247                         QStringList tokens = QStringList::split ( ":", value );
00248                         key = tokens.first();                   
00249                         val = tokens.last();
00250                         addGroup (group,key,val);
00251                 }
00252                 if (handle->atEnd()) {
00253                         break;
00254                 }
00255         }
00256         handle -> close();
00257 }
00258 
00259 //====================================
00260 // storeDataSysp...
00261 //------------------------------------
00262 void SaXProcess::storeDataSysp (void) {
00263         // .../
00266         // ----
00267         QList<QString> data = mProc->readStdout();
00268         QListIterator<QString> in (data);
00269         for (; in.current(); ++in) {
00270                 int id = 0;
00271                 QString line (*in.current());
00272                 QStringList tokens = QStringList::split ( "=>", line );
00273                 QString idstr = tokens.first();
00274                 QString data  = tokens.last();
00275                 QStringList datalist = QStringList::split ( ":", data );
00276                 QString key = datalist.first();
00277                 QString val = datalist.last();
00278                 QRegExp idExp ("(\\d+)");
00279                 int rpos = idExp.search (idstr,0);
00280                 if (rpos >= 0) {
00281                         id = idExp.cap().toInt();
00282                 }
00283                 addID (id);
00284                 val = val.stripWhiteSpace();
00285                 key = key.stripWhiteSpace();
00286                 if ((! key.isEmpty()) && (! val.isEmpty())) {
00287                         setItem (key,val);
00288                 }
00289         }
00290 }
00291 
00292 //====================================
00293 // storeData...
00294 //------------------------------------
00295 void SaXProcess::storeData (void) {
00296         // .../
00299         // ----
00300         QList<QString> data = mProc->readStdout();
00301         QListIterator<QString> in (data);
00302         for (; in.current(); ++in) {
00303                 QString line (*in.current());
00304                 QString cnr;
00305                 QString key;
00306                 QString val;
00307                 int index = 0;
00308                 QStringList tokens = QStringList::split ( ":", line );
00309                 for ( QStringList::Iterator
00310                         in = tokens.begin(); in != tokens.end(); ++in
00311                 ) {
00312                         QString item (*in);
00313                         item = item.stripWhiteSpace();
00314                         switch (index) {
00315                         case 0:
00316                                 cnr = item;
00317                         break;
00318                         case 1:
00319                                 key = item;
00320                         break;
00321                         case 2:
00322                                 val = item;
00323                         break;
00324                         default:
00325                                 bool isNumber = false;
00326                                 if (key == "Screen") {
00327                                         QRegExp idExp ("^(\\d+)$");
00328                                         if (idExp.search (val,0) >= 0) {
00329                                                 isNumber=true;
00330                                         }
00331                                 }
00332                                 if (
00333                                         ((key == "Screen") && (!isNumber)) ||
00334                                          (key == "Modes")||(key == "Virtual")
00335                                 ) {
00336                                         key = key+":"+val;
00337                                         val = item;
00338                                 } else {
00339                                         val = val+":"+item;
00340                                 }
00341                         break;
00342                         }
00343                         index++;
00344                 }
00345                 if (val.isEmpty()) {
00346                         continue;
00347                 }
00348                 addID   (cnr.toInt());
00349                 setItem (key,val);
00350         }
00351 }
00352 } // end namespace

Generated on Wed Sep 14 10:27:01 2005 for libsax by  doxygen 1.4.4