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_POINTERS:
00135                         file = CDBPOINTERS;
00136                 break;
00137                 case CDB_TABLETS:
00138                         file = CDBTABLETS;
00139                 break;
00140                 case CDB_TOUCHERS:
00141                         file = CDBTOUCHERS;
00142                 break;
00143                 default:
00144                         excCDBFileFailed ();
00145                         qError (errorString(),EXC_CDBFILEFAILED);
00146                 break;
00147         }
00148         QFile* handle = new QFile (file);
00149         if (! handle -> open(IO_ReadOnly)) {
00150                 excFileOpenFailed ( errno );
00151                 qError (errorString(),EXC_FILEOPENFAILED);
00152                 return;
00153         }
00154         QString line;
00155         QString group,key,val;
00156         while ((handle->readLine (line,MAX_LINE_LENGTH)) != 0) {
00157                 line.truncate(line.length()-1);
00158                 if ((line[0] == '#') || (line.isEmpty())) {
00159                         if (handle->atEnd()) {
00160                                 break;
00161                         }
00162                         continue;
00163                 }
00164                 int bp = line.find('{');
00165                 if (bp >= 0) {
00166                         QStringList tokens = QStringList::split ( ":", line );
00167                         QString vendor = tokens.first();
00168                         QString name   = tokens.last();
00169                         name.truncate(
00170                                 name.find('{')
00171                         );
00172                         name   = name.stripWhiteSpace();
00173                         vendor = vendor.stripWhiteSpace();
00174                         group = vendor+":"+name;
00175                 } else {
00176                         bp = line.find('}');
00177                         if (bp >= 0) {
00178                                 continue;
00179                         }
00180                         QStringList tokens = QStringList::split ( "=", line );
00181                         key = tokens.first();
00182                         val = tokens.last();
00183                         val = val.stripWhiteSpace();
00184                         key = key.stripWhiteSpace();
00185                         // ... /
00186                         // CDB keys and ISAX keys are not the same,
00187                         // check this and adapt to ISAX keys
00188                         // ---
00189                         if (key == "Hsync") {
00190                                 key = "HorizSync";
00191                         }
00192                         if (key == "Vsync") {
00193                                 key = "VertRefresh";
00194                         }
00195                         if (key == "Modeline") {
00196                                 key = "SpecialModeline";
00197                         }
00198                         addGroup (group,key,val);
00199                 }
00200                 if (handle->atEnd()) {
00201                         break;
00202                 }
00203         }
00204         handle -> close();
00205 }
00206 
00207 //====================================
00208 // storeDataSYS...
00209 //------------------------------------
00210 void SaXProcess::storeDataSYS (int fileID) {
00211         // .../
00215         // ----
00216         QString file;
00217         switch (fileID) {
00218                 case CDB_CARDMODULES:
00219                         file = CDBCARDMODULES;
00220                 break;
00221                 case CDB_TABLETMODULES:
00222                         file = CDBTABLETMODULES;
00223                 break;
00224                 default:
00225                         excCDBFileFailed ();
00226                         qError (errorString(),EXC_CDBFILEFAILED);
00227                 break;
00228         }
00229         QFile* handle = new QFile (file);
00230         if (! handle -> open(IO_ReadOnly)) {
00231                 excFileOpenFailed ( errno );
00232                 qError (errorString(),EXC_FILEOPENFAILED);
00233                 return;
00234         }
00235         QString line;
00236         QString group,key,val;
00237         while ((handle->readLine (line,MAX_LINE_LENGTH)) != 0) {
00238                 line.truncate(line.length()-1);
00239                 if ((line[0] == '#') || (line.isEmpty())) {
00240                         if (handle->atEnd()) {
00241                                 break;
00242                         }
00243                         continue;
00244                 }
00245                 QStringList tokens = QStringList::split ( "=", line );
00246                 group  = tokens.first();
00247                 if (group.contains("Format:(")) {
00248                         continue;
00249                 }
00250                 tokens = QStringList::split ( " ", tokens.last() );
00251                 for (QStringList::Iterator it=tokens.begin(); it!=tokens.end();++ it) {
00252                         QString value (*it);
00253                         QStringList tokens = QStringList::split ( ":", value );
00254                         key = tokens.first();                   
00255                         val = tokens.last();
00256                         addGroup (group,key,val);
00257                 }
00258                 if (handle->atEnd()) {
00259                         break;
00260                 }
00261         }
00262         handle -> close();
00263 }
00264 
00265 //====================================
00266 // storeDataSysp...
00267 //------------------------------------
00268 void SaXProcess::storeDataSysp (void) {
00269         // .../
00272         // ----
00273         QList<QString> data = mProc->readStdout();
00274         QListIterator<QString> in (data);
00275         for (; in.current(); ++in) {
00276                 int id = 0;
00277                 QString line (*in.current());
00278                 QStringList tokens = QStringList::split ( "=>", line );
00279                 QString idstr = tokens.first();
00280                 QString data  = tokens.last();
00281                 QStringList datalist = QStringList::split ( ":", data );
00282                 QString key = datalist.first();
00283                 QString val = datalist.last();
00284                 QRegExp idExp ("(\\d+)");
00285                 int rpos = idExp.search (idstr,0);
00286                 if (rpos >= 0) {
00287                         id = idExp.cap().toInt();
00288                 }
00289                 addID (id);
00290                 val = val.stripWhiteSpace();
00291                 key = key.stripWhiteSpace();
00292                 if ((! key.isEmpty()) && (! val.isEmpty())) {
00293                         setItem (key,val);
00294                 }
00295         }
00296 }
00297 
00298 //====================================
00299 // storeData...
00300 //------------------------------------
00301 void SaXProcess::storeData (void) {
00302         // .../
00305         // ----
00306         QList<QString> data = mProc->readStdout();
00307         QListIterator<QString> in (data);
00308         for (; in.current(); ++in) {
00309                 QString line (*in.current());
00310                 QString cnr;
00311                 QString key;
00312                 QString val;
00313                 int index = 0;
00314                 QStringList tokens = QStringList::split ( ":", line );
00315                 for ( QStringList::Iterator
00316                         in = tokens.begin(); in != tokens.end(); ++in
00317                 ) {
00318                         QString item (*in);
00319                         item = item.stripWhiteSpace();
00320                         switch (index) {
00321                         case 0:
00322                                 cnr = item;
00323                         break;
00324                         case 1:
00325                                 key = item;
00326                         break;
00327                         case 2:
00328                                 val = item;
00329                         break;
00330                         default:
00331                                 bool isNumber = false;
00332                                 if ((key == "Screen") || (key == "Relative")) {
00333                                         QRegExp idExp ("^(\\d+)$");
00334                                         if (idExp.search (val,0) >= 0) {
00335                                                 isNumber=true;
00336                                         }
00337                                 }
00338                                 if (
00339                                         (((key == "Screen") || (key == "Relative")) &&
00340                                          (!isNumber)) || (key == "Modes")||(key == "Virtual")
00341                                 ) {
00342                                         key = key+":"+val;
00343                                         val = item;
00344                                 } else {
00345                                         val = val+":"+item;
00346                                 }
00347                         break;
00348                         }
00349                         index++;
00350                 }
00351                 if (val.isEmpty()) {
00352                         continue;
00353                 }
00354                 addID   (cnr.toInt());
00355                 setItem (key,val);
00356         }
00357 }
00358 } // end namespace

Generated on Tue May 2 11:17:31 2006 for libsax by  doxygen 1.4.6