00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "process.h"
00022
00023 namespace SaX {
00024
00025
00026
00027 SaXProcess::SaXProcess ( void ) {
00028
00034
00035 mProc = new SaXProcessCall ();
00036 }
00037
00038
00039
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
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
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
00181
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
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
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
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 }