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         //====================================
00149         // search all entries for file
00150         //------------------------------------
00151         DIR* CDBDir = 0;
00152         struct dirent* entry = 0;
00153         CDBDir = opendir (CDBDIR);
00154         QList<QString> fileList;
00155         if (! CDBDir) {
00156                 excFileOpenFailed ( errno );
00157                 qError (errorString(),EXC_FILEOPENFAILED);
00158                 return;
00159         }
00160         while (1) {
00161                 entry = readdir (CDBDir);
00162                 if (! entry) {
00163                         break;
00164                 }
00165                 QString* updateFile = new QString();
00166                 QTextOStream (updateFile) << CDBDIR << entry->d_name;
00167                 if (*updateFile == file) {
00168                         continue;
00169                 }
00170                 if ((updateFile->contains(file)) && (entry->d_type != DT_DIR)) {
00171                         fileList.append (updateFile);
00172                 }
00173         }
00174         closedir (CDBDir);
00175         fileList.append (&file);
00176         QListIterator<QString> it (fileList);
00177 
00178         //====================================
00179         // read in file list
00180         //------------------------------------
00181         for (; it.current(); ++it) {
00182                 QFile* handle = new QFile (it.current()->ascii());
00183                 if (! handle -> open(IO_ReadOnly)) {
00184                         excFileOpenFailed ( errno );
00185                         qError (errorString(),EXC_FILEOPENFAILED);
00186                         return;
00187                 }
00188                 QString line;
00189                 QString group,key,val;
00190                 while ((handle->readLine (line,MAX_LINE_LENGTH)) != 0) {
00191                         line.truncate(line.length()-1);
00192                         if ((line[0] == '#') || (line.isEmpty())) {
00193                                 if (handle->atEnd()) {
00194                                         break;
00195                                 }
00196                                 continue;
00197                         }
00198                         int bp = line.find('{');
00199                         if (bp >= 0) {
00200                                 QStringList tokens = QStringList::split ( ":", line );
00201                                 QString vendor = tokens.first();
00202                                 QString name   = tokens.last();
00203                                 name.truncate(
00204                                         name.find('{')
00205                                 );
00206                                 name   = name.stripWhiteSpace();
00207                                 vendor = vendor.stripWhiteSpace();
00208                                 group = vendor+":"+name;
00209                         } else {
00210                                 bp = line.find('}');
00211                                 if (bp >= 0) {
00212                                         continue;
00213                                 }
00214                                 QStringList tokens = QStringList::split ( "=", line );
00215                                 key = tokens.first();
00216                                 val = tokens.last();
00217                                 val = val.stripWhiteSpace();
00218                                 key = key.stripWhiteSpace();
00219                                 // ... /
00220                                 // CDB keys and ISAX keys are not the same,
00221                                 // check this and adapt to ISAX keys
00222                                 // ---
00223                                 if (key == "Hsync") {
00224                                         key = "HorizSync";
00225                                 }
00226                                 if (key == "Vsync") {
00227                                         key = "VertRefresh";
00228                                 }
00229                                 if (key == "Modeline") {
00230                                         key = "SpecialModeline";
00231                                 }
00232                                 addGroup (group,key,val);
00233                         }
00234                         if (handle->atEnd()) {
00235                                 break;
00236                         }
00237                 }
00238                 handle -> close();
00239         }
00240 }
00241 
00242 //====================================
00243 // storeDataSYS...
00244 //------------------------------------
00245 void SaXProcess::storeDataSYS (int fileID) {
00246         // .../
00250         // ----
00251         QString file;
00252         switch (fileID) {
00253                 case CDB_CARDMODULES:
00254                         file = CDBCARDMODULES;
00255                 break;
00256                 case CDB_TABLETMODULES:
00257                         file = CDBTABLETMODULES;
00258                 break;
00259                 default:
00260                         excCDBFileFailed ();
00261                         qError (errorString(),EXC_CDBFILEFAILED);
00262                 break;
00263         }
00264         QFile* handle = new QFile (file);
00265         if (! handle -> open(IO_ReadOnly)) {
00266                 excFileOpenFailed ( errno );
00267                 qError (errorString(),EXC_FILEOPENFAILED);
00268                 return;
00269         }
00270         QString line;
00271         QString group,key,val;
00272         while ((handle->readLine (line,MAX_LINE_LENGTH)) != 0) {
00273                 line.truncate(line.length()-1);
00274                 if ((line[0] == '#') || (line.isEmpty())) {
00275                         if (handle->atEnd()) {
00276                                 break;
00277                         }
00278                         continue;
00279                 }
00280                 QStringList tokens = QStringList::split ( "=", line );
00281                 group  = tokens.first();
00282                 if (group.contains("Format:(")) {
00283                         continue;
00284                 }
00285                 tokens = QStringList::split ( " ", tokens.last() );
00286                 for (QStringList::Iterator it=tokens.begin(); it!=tokens.end();++ it) {
00287                         QString value (*it);
00288                         QStringList tokens = QStringList::split ( ":", value );
00289                         key = tokens.first();                   
00290                         val = tokens.last();
00291                         addGroup (group,key,val);
00292                 }
00293                 if (handle->atEnd()) {
00294                         break;
00295                 }
00296         }
00297         handle -> close();
00298 }
00299 
00300 //====================================
00301 // storeDataSysp...
00302 //------------------------------------
00303 void SaXProcess::storeDataSysp (void) {
00304         // .../
00307         // ----
00308         QList<QString> data = mProc->readStdout();
00309         QListIterator<QString> in (data);
00310         for (; in.current(); ++in) {
00311                 int id = 0;
00312                 QString line (*in.current());
00313                 QStringList tokens = QStringList::split ( "=>", line );
00314                 QString idstr = tokens.first();
00315                 QString data  = tokens.last();
00316                 QStringList datalist = QStringList::split ( ":", data );
00317                 QString key = datalist.first();
00318                 QString val = datalist.last();
00319                 QRegExp idExp ("(\\d+)");
00320                 int rpos = idExp.search (idstr,0);
00321                 if (rpos >= 0) {
00322                         id = idExp.cap().toInt();
00323                 }
00324                 addID (id);
00325                 val = val.stripWhiteSpace();
00326                 key = key.stripWhiteSpace();
00327                 if ((! key.isEmpty()) && (! val.isEmpty())) {
00328                         setItem (key,val);
00329                 }
00330         }
00331 }
00332 
00333 //====================================
00334 // storeData...
00335 //------------------------------------
00336 void SaXProcess::storeData (void) {
00337         // .../
00340         // ----
00341         QList<QString> data = mProc->readStdout();
00342         QListIterator<QString> in (data);
00343         for (; in.current(); ++in) {
00344                 QString line (*in.current());
00345                 QString cnr;
00346                 QString key;
00347                 QString val;
00348                 int index = 0;
00349                 QStringList tokens = QStringList::split ( ":", line );
00350                 for ( QStringList::Iterator
00351                         in = tokens.begin(); in != tokens.end(); ++in
00352                 ) {
00353                         QString item (*in);
00354                         item = item.stripWhiteSpace();
00355                         switch (index) {
00356                         case 0:
00357                                 cnr = item;
00358                         break;
00359                         case 1:
00360                                 key = item;
00361                         break;
00362                         case 2:
00363                                 val = item;
00364                         break;
00365                         default:
00366                                 bool isNumber = false;
00367                                 if ((key == "Screen") || (key == "Relative")) {
00368                                         QRegExp idExp ("^(\\d+)$");
00369                                         if (idExp.search (val,0) >= 0) {
00370                                                 isNumber=true;
00371                                         }
00372                                 }
00373                                 if (
00374                                         (((key == "Screen") || (key == "Relative")) &&
00375                                          (!isNumber)) || (key == "Modes")||(key == "Virtual")
00376                                 ) {
00377                                         key = key+":"+val;
00378                                         val = item;
00379                                 } else {
00380                                         val = val+":"+item;
00381                                 }
00382                         break;
00383                         }
00384                         index++;
00385                 }
00386                 if (val.isEmpty()) {
00387                         continue;
00388                 }
00389                 addID   (cnr.toInt());
00390                 setItem (key,val);
00391         }
00392 }
00393 } // end namespace

Generated on Mon Jun 19 12:42:49 2006 for libsax by  doxygen 1.4.6