libsax 7.2

card.cpp

00001 /**************
00002 FILE          : card.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 "card.h"
00022 
00023 namespace SaX {
00024 //====================================
00025 // Constructor...
00026 //------------------------------------
00027 SaXManipulateCard::SaXManipulateCard (SaXImport* in, int card) {
00028         // .../
00032         // ----
00033         mImport = 0;
00034         if ( ! in ) {
00035                 excNullPointerArgument ();
00036                 qError (errorString(),EXC_NULLPOINTERARGUMENT);
00037                 return;
00038         }
00039         if ( in->getSectionID() != SAX_CARD ) {
00040                 excCardImportBindFailed ( in->getSectionID() );
00041                 qError (errorString(),EXC_CARDIMPORTBINDFAILED);
00042                 return;
00043         }
00044         mImport = in;
00045         mCard   = card;
00046         mImport -> setID ( mCard );
00047         mCDBCardModules = 0;
00048 }
00049 
00050 //====================================
00051 // set card ID
00052 //------------------------------------
00053 bool SaXManipulateCard::selectCard (int card) {
00054         // .../
00057         // ----
00058         if (! mImport) {
00059                 return false;
00060         }
00061         if (mImport -> setID ( card )) {
00062                 mCard = card;
00063                 return true;
00064         }
00065         return false;
00066 }
00067 
00068 //====================================
00069 // setCardDriver
00070 //------------------------------------
00071 void SaXManipulateCard::setCardDriver (const QString& driver ) {
00072         // .../
00074         // ----
00075         if (! mImport) {
00076                 return;
00077         }
00078         mImport -> setItem ("Driver",driver);
00079 }
00080 
00081 //====================================
00082 // addCardExternal
00083 //------------------------------------
00084 void SaXManipulateCard::addCardExternal ( const QString& ident ) {
00085         // .../
00088         // ----
00089         if (! mImport) {
00090                 return;
00091         }
00092         QString val;
00093         Q3Dict<QString> options = getOptions();
00094         if ( options["SaXExternal"] ) {
00095                 val = *options["SaXExternal"]+"+"+"Identifier&"+ident;
00096         } else {
00097                 val = "Identifier&"+ident;
00098         }
00099         mImport->removeRawItem ("RawData","Option \"SaXExternal\"");
00100         mImport->addRawItem ("RawData","Option \"SaXExternal\"","\""+val+"\"");
00101 }
00102 
00103 //====================================
00104 // addCardExternalOption
00105 //------------------------------------
00106 void SaXManipulateCard::addCardExternalOption (
00107         const QString& keyword, const QString& value
00108 ) {
00109         // .../
00113         // ----
00114         if (! mImport) {
00115                 return;
00116         }
00117         QString val;
00118         Q3Dict<QString> options = getOptions();
00119         if ( options["SaXExternal"] ) {
00120                 val = *options["SaXExternal"]+"+"+keyword+"&"+value;
00121         } else {
00122                 val = keyword+"&"+value;
00123         }
00124         mImport->removeRawItem ("RawData","Option \"SaXExternal\"");
00125         mImport->addRawItem ("RawData","Option \"SaXExternal\"","\""+val+"\"");
00126 }
00127 
00128 //====================================
00129 // setCardOption
00130 //------------------------------------
00131 void SaXManipulateCard::setCardOption (
00132         const QString& keyword, const QString& value
00133 ) {
00134         // .../
00137         // ----
00138         if (! mImport) {
00139                 return;
00140         }
00141         QString key (keyword);
00142         QString val (value);
00143         if ( value.isNull()) {
00144                 //====================================
00145                 // set bool option
00146                 //------------------------------------
00147                 mImport->setItem ("Option",key);
00148         } else {
00149                 //====================================
00150                 // set value added option
00151                 //------------------------------------
00152                 mImport->setRawItem ("RawData","Option \""+key+"\"","\""+val+"\"");
00153         }
00154 }
00155 
00156 //====================================
00157 // addCardOption 
00158 //------------------------------------
00159 void SaXManipulateCard::addCardOption (
00160         const QString& keyword, const QString& value
00161 ) {
00162         // .../
00165         // ----
00166         if (! mImport) {
00167                 return;
00168         }
00169         QString key (keyword);
00170         QString val (value);
00171         if ( value.isNull()) {
00172                 //====================================
00173                 // add bool option
00174                 //------------------------------------
00175                 mImport->addItem ("Option",key);
00176         } else {
00177                 //====================================
00178                 // add value added option
00179                 //------------------------------------
00180                 mImport->addRawItem ("RawData","Option \""+key+"\"","\""+val+"\"");
00181         }
00182 }
00183 
00184 //====================================
00185 // removeCardOption
00186 //------------------------------------
00187 void SaXManipulateCard::removeCardOption (const QString& value) {
00188         // .../
00192         // ----
00193         if (! mImport) {
00194                 return;
00195         }
00196         QString val (value);
00197         QString str = mImport->getItem("RawData");
00198         if (! str.contains ("\""+val+"\"")) {
00199                 //====================================
00200                 // remove bool option
00201                 //------------------------------------
00202                 mImport->removeItem ("Option",val);
00203         } else {
00204                 //====================================
00205                 // remove value added option
00206                 //------------------------------------
00207                 mImport->removeRawItem ("RawData","Option \""+val+"\"");
00208         }
00209 }
00210 
00211 //====================================
00212 // setBusID
00213 //------------------------------------
00214 void SaXManipulateCard::setBusID  (const QString& busid) {
00215         // .../
00217         // ----
00218         if (! mImport) {
00219                 return;
00220         }
00221         mImport -> setItem ("BusID",busid);
00222 }
00223 
00224 //====================================
00225 // setScreenID
00226 //------------------------------------
00227 void SaXManipulateCard::setScreenID (int screen) {
00228         // .../
00232         // ----
00233         if (! mImport) {
00234                 return;
00235         }
00236         QString screenID; screenID.sprintf ("%d",screen);
00237         mImport -> setItem ("Screen",screenID);
00238 }
00239 
00240 //====================================
00241 // setRotate
00242 //------------------------------------
00243 void SaXManipulateCard::setRotate (int direction) {
00244         // .../
00247         // ----
00248         if (! mImport) {
00249                 return;
00250         }
00251         if (direction == SAX_ROTATE_LEFT) {
00252                 mImport -> setItem ("Rotate","CCW");
00253         }
00254         if (direction == SAX_ROTATE_RIGHT) {
00255                 mImport -> setItem ("Rotate","CW");
00256         }
00257 }
00258 
00259 //====================================
00260 // getCardName
00261 //------------------------------------
00262 QString SaXManipulateCard::getCardName (void) {
00263         // .../
00266         // ----
00267         if (! mImport) {
00268                 QString* nope = new QString;
00269                 return *nope;
00270         }
00271         //====================================
00272         // search name in SYSP data
00273         //------------------------------------
00274         SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00275         pCard -> doImport();
00276         if (pCard -> setID ( mCard )) {
00277                 QString mCardName;
00278                 QTextOStream (&mCardName) <<
00279                         pCard->getItem("Vendor") << ":" << pCard->getItem("Device");
00280                 return mCardName;
00281         }
00282         //====================================
00283         // search name in ISAX data
00284         //------------------------------------
00285         QString mCardName;
00286         QTextOStream (&mCardName) <<
00287                 mImport->getItem("Vendor") << ":" << mImport->getItem("Name");
00288         return mCardName;
00289 }
00290 
00291 //====================================
00292 // getCardVendor
00293 //------------------------------------
00294 QString SaXManipulateCard::getCardVendor (void) {
00295         // .../
00298         // ----
00299         if (! mImport) {
00300                 QString* nope = new QString;
00301                 return *nope;
00302         }
00303         //====================================
00304         // search vendor in SYSP data
00305         //------------------------------------
00306         SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00307         pCard -> doImport();
00308         if (pCard -> setID ( mCard )) {
00309                 return pCard->getItem("Vendor");
00310         }
00311         //====================================
00312         // search vendor in ISAX data
00313         //------------------------------------
00314         return mImport->getItem("Vendor");
00315 }
00316 
00317 //====================================
00318 // getCardModel
00319 //------------------------------------
00320 QString SaXManipulateCard::getCardModel (void) {
00321         // .../
00324         // ----
00325         if (! mImport) {
00326                 QString* nope = new QString;
00327                 return *nope;
00328         }
00329         //====================================
00330         // search model in SYSP data
00331         //------------------------------------
00332         SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00333         pCard -> doImport();
00334         if (pCard -> setID ( mCard )) {
00335                 return pCard->getItem("Device");
00336         }
00337         //====================================
00338         // search model in ISAX data
00339         //------------------------------------
00340         return mImport->getItem("Name");
00341 }
00342 
00343 //====================================
00344 // getBusID
00345 //------------------------------------
00346 QString SaXManipulateCard::getBusID (void) {
00347         // .../
00350         // ----
00351         if (! mImport) {
00352                 QString* nope = new QString;
00353                 return *nope;
00354         }
00355         return mImport -> getItem ("BusID");
00356 }
00357 
00358 //====================================
00359 // getCardDriver
00360 //------------------------------------
00361 QString SaXManipulateCard::getCardDriver (void) {
00362         // .../
00365         // ----
00366         if (! mImport) {
00367                 QString* nope = new QString;
00368                 return *nope;
00369         }
00370         return mImport -> getItem ("Driver");
00371 }
00372 
00373 //====================================
00374 // getScreenID
00375 //------------------------------------
00376 QString SaXManipulateCard::getScreenID (void) {
00377         // .../
00380         // ----
00381         if (! mImport) {
00382                 QString* nope = new QString;
00383                 return *nope;
00384         }
00385         return mImport -> getItem ("Screen");
00386 }
00387 
00388 //====================================
00389 // getRotationDirection
00390 //------------------------------------
00391 QString SaXManipulateCard::getRotationDirection (void) {
00392         // .../
00396         // ---- 
00397         if (! mImport) {
00398                 QString* nope = new QString;
00399                 return *nope;
00400         }
00401         return mImport -> getItem ("Rotate");
00402 }
00403 
00404 //====================================
00405 // getOptions
00406 //------------------------------------
00407 Q3Dict<QString> SaXManipulateCard::getOptions (void) {
00408         // .../
00414         // ----
00415         if (! mImport) {
00416                 Q3Dict<QString>* nope = new Q3Dict<QString>;
00417                 return *nope;
00418         }
00419         Q3Dict<QString> result;
00420         QString stdOptions = mImport -> getItem ("Option");
00421         QString rawOptions = mImport -> getItem ("RawData");
00422         //====================================
00423         // remove commented options from data
00424         //------------------------------------
00425         rawOptions.replace(
00426                 QRegExp("#Option  \"(.*)\" \"(.*)\""),""
00427         );
00428         //====================================
00429         // handle bool options
00430         //------------------------------------
00431         QStringList stdlist = QStringList::split ( ",", stdOptions );
00432         for ( QStringList::Iterator
00433                 in = stdlist.begin(); in != stdlist.end(); ++in
00434         ) {
00435                 QString item (*in);
00436                 result.insert (item,new QString);
00437         }
00438         //====================================
00439         // handle value added options
00440         //------------------------------------
00441         QStringList rawlist = QStringList::split ( "Option", rawOptions );
00442         for ( QStringList::Iterator
00443                 in = rawlist.begin(); in != rawlist.end(); ++in
00444         ) {
00445                 QString item (*in);
00446                 QRegExp itemExp ("\"(.*)\" \"(.*)\"");
00447                 int pos = itemExp.search (item);
00448                 if (pos >= 0) {
00449                         QString key = itemExp.cap(1);
00450                         QString* val = new QString (itemExp.cap(2));
00451                         result.insert (key,val);
00452                 }
00453         }
00454         return result;
00455 }
00456 
00457 //====================================
00458 // getCardDrivers
00459 //------------------------------------
00460 QList<QString> SaXManipulateCard::getCardDrivers ( void ) {
00461         // .../
00465         // ----
00466         mCDBCardDrivers.clear();
00467         if ( ! mCDBCardModules ) {
00468                 mCDBCardModules = new SaXProcess ();
00469                 mCDBCardModules -> start (CDB_CARDMODULES);
00470         }
00471         Q3Dict< Q3Dict<QString> > CDBModules = mCDBCardModules->getTablePointerCDB();
00472         Q3DictIterator< Q3Dict<QString> > it (CDBModules);
00473         for (; it.current(); ++it) {
00474                 mCDBCardDrivers.append (QString(it.currentKey()));
00475         }
00476         return mCDBCardDrivers;
00477 }
00478 
00479 //====================================
00480 // getCardOptions
00481 //------------------------------------
00482 Q3Dict<QString> SaXManipulateCard::getCardOptions ( const QString& driver ) {
00483         // .../
00487         // ----
00488         mCDBCardOptions.clear();
00489         if ( ! mCDBCardModules ) {
00490                 mCDBCardModules = new SaXProcess ();
00491                 mCDBCardModules -> start (CDB_CARDMODULES);
00492         }
00493         Q3PtrList< Q3Dict<QString> > opts;
00494         opts = mCDBCardModules -> getTablePointerCDB_DATA (
00495                 driver
00496         );
00497         if (opts.isEmpty()) {
00498                 excCDBRecordNotFound (driver);
00499                 qError (errorString(),EXC_CDBRECORDNOTFOUND);
00500                 Q3Dict<QString>* nope = new Q3Dict<QString>;
00501                 return *nope;
00502         }
00503         Q3PtrList< Q3Dict<QString> > xaaopts;
00504         xaaopts = mCDBCardModules -> getTablePointerCDB_DATA (
00505                 "xaa"
00506         );
00507         mCDBCardOptions = *opts.at(0);
00508         if (!xaaopts.isEmpty()) {
00509                 Q3DictIterator<QString> it (*xaaopts.at(0));
00510                 for (; it.current(); ++it) {
00511                         mCDBCardOptions.insert (it.currentKey(),it.current());
00512                 }
00513         }
00514         return mCDBCardOptions;
00515 }
00516 
00517 //====================================
00518 // isNoteBook
00519 //------------------------------------
00520 bool SaXManipulateCard::isNoteBook ( void ) {
00521         // .../
00525         // ----
00526         struct dirent* entry = NULL;
00527         DIR* batteryDir = NULL;
00528         batteryDir = opendir (ACPI_BATTERY);
00529         if (! batteryDir) {
00530                 return false;
00531         }
00532         int BATs = 0;
00533         while (1) {
00534                 entry = readdir (batteryDir);
00535                 if (! entry) {
00536                         break;
00537                 }
00538                 QString file (entry->d_name);
00539                 if ((file == ".") || (file == "..")) {
00540                         continue;
00541                 }
00542                 BATs++;
00543         }
00544         if (BATs == 0) {
00545                 return false;
00546         }
00547         return true;
00548 }
00549 
00550 //====================================
00551 // getCards
00552 //------------------------------------
00553 int SaXManipulateCard::getCards ( void ) {
00554         // .../
00558         // ----
00559         if (! mImport) {
00560                 return -1;
00561         }
00562         SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00563         pCard -> doImport();
00564         if (!(pCard->getItem("Detected")).isNull()) {
00565                 return pCard->getItem("Detected").toInt();
00566         }
00567         return -1;
00568 }
00569 
00570 //====================================
00571 // getDevices
00572 //------------------------------------
00573 int SaXManipulateCard::getDevices ( void ) {
00574         // .../
00580         // ----
00581         if (! mImport) {
00582                 return -1;
00583         }
00584         return mImport->getCount();
00585 }
00586 
00587 //====================================
00588 // getHeads
00589 //------------------------------------
00590 int SaXManipulateCard::getHeads ( void ) {
00591         // .../
00595         // ----
00596         if (! mImport) {
00597                 return -1;
00598         }
00599         int mBoards  = getCards();
00600         int mDevices = mImport -> getCount();
00601         //====================================
00602         // check for NoteBooks, assume *2
00603         //------------------------------------
00604         if ( isNoteBook() ) {
00605                 return mBoards * 2;
00606         }
00607         //====================================
00608         // get sysp card name
00609         //------------------------------------
00610         SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00611         pCard -> doImport();
00612         QString mCardName;
00613         QTextOStream (&mCardName) <<
00614                 pCard->getItem("Vendor") << ":" << pCard->getItem("Device");
00615         //====================================
00616         // import CDB DB for profile names
00617         //------------------------------------
00618         SaXProcess* pCDB = new SaXProcess();
00619         pCDB -> start ( CDB_CARDS );
00620         Q3Dict< Q3Dict<QString> > CDBData = pCDB -> getTablePointerCDB();
00621         //====================================
00622         // check profile names
00623         //------------------------------------
00624         int headCount = 0;
00625         int realCount = 0;
00626         int currentCard = mCard;
00627         while (1) {
00628                 if (realCount >= mDevices) {
00629                         selectCard (currentCard);
00630                         return headCount;
00631                 }
00632                 selectCard (realCount);
00633                 if ( CDBData[mCardName] ) {
00634                         Q3Dict<QString> CDBTable = *CDBData[mCardName];
00635                         if (CDBTable["Profile"]) {
00636                                 QString mProfile = *CDBTable["Profile"];
00637                                 if (mProfile == "NVidia_DualHead_DriverOptions") {
00638                                         headCount += 2;
00639                                         realCount += 1;
00640                                         continue;
00641                                 }
00642                                 if (mProfile == "NVidia_DualHead") {
00643                                         headCount += 2;
00644                                         realCount += 2;
00645                                         continue;
00646                                 }
00647                                 if (mProfile == "Radeon_DualHead_DriverOptions") {
00648                                         headCount += 2;
00649                                         realCount += 1;
00650                                         continue;
00651                                 }
00652                                 if (mProfile == "Radeon_DualHead") {
00653                                         headCount += 2;
00654                                         realCount += 2;
00655                                         continue;
00656                                 }
00657                                 if (mProfile == "FGLRX_DualHead_DriverOptions") {
00658                                         headCount += 2;
00659                                         realCount += 1;
00660                                         continue;
00661                                 }
00662                                 if (mProfile == "FGLRX_DualHead") {
00663                                         headCount += 2;
00664                                         realCount += 2;
00665                                         continue;
00666                                 }
00667                                 if (mProfile == "Intel_DualHead_DriverOptions") {
00668                                         headCount += 2;
00669                                         realCount += 1;
00670                                         continue;
00671                                 }
00672                                 if (mProfile == "Intel_DualHead") {
00673                                         headCount += 2;
00674                                         realCount += 2;
00675                                         continue;
00676                                 }
00677                                 if (mProfile == "IntelNext_DualHead") {
00678                                         headCount += 2;
00679                                         realCount += 2;
00680                                         continue;
00681                                 }
00682                                 if (mProfile == "IntelNext_DualHead_DriverOptions") {
00683                                         headCount += 2;
00684                                         realCount += 1;
00685                                         continue;
00686                                 }       
00687                                 if (mProfile == "Matrox_DualHead_DriverOptions") {
00688                                         headCount += 2;
00689                                         realCount += 1;
00690                                         continue;
00691                                 }
00692                                 if (mProfile == "Matrox_DualHead") {
00693                                         headCount += 2;
00694                                         realCount += 2;
00695                                         continue;
00696                                 }
00697                                 if (mProfile == "SiS_DualHead_DriverOptions") {
00698                                         headCount += 2;
00699                                         realCount += 1;
00700                                         continue;
00701                                 }
00702                                 if (mProfile == "SiS_DualHead") {
00703                                         headCount += 2;
00704                                         realCount += 2;
00705                                         continue;
00706                                 }
00707                         }
00708                 }
00709                 realCount++;
00710                 headCount++;
00711         }
00712         //====================================
00713         // return board count, last chance
00714         //------------------------------------
00715         return mBoards;
00716 }
00717 } // end namespace