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 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
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
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
00187
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
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
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
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 }