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 // setCardOption
00083 //------------------------------------
00084 void SaXManipulateCard::setCardOption (
00085         const QString& keyword, const QString& value
00086 ) {
00087         // .../
00090         // ----
00091         if (! mImport) {
00092                 return;
00093         }
00094         QString key (keyword);
00095         QString val (value);
00096         if (! value) {
00097                 //====================================
00098                 // set bool option
00099                 //------------------------------------
00100                 mImport->setItem ("Option",key);
00101         } else {
00102                 //====================================
00103                 // set value added option
00104                 //------------------------------------
00105                 mImport->setRawItem ("RawData","Option \""+key+"\"","\""+val+"\"");
00106         }
00107 }
00108 
00109 //====================================
00110 // addCardOption 
00111 //------------------------------------
00112 void SaXManipulateCard::addCardOption (
00113         const QString& keyword, const QString& value
00114 ) {
00115         // .../
00118         // ----
00119         if (! mImport) {
00120                 return;
00121         }
00122         QString key (keyword);
00123         QString val (value);
00124         if (! value) {
00125                 //====================================
00126                 // add bool option
00127                 //------------------------------------
00128                 mImport->addItem ("Option",key);
00129         } else {
00130                 //====================================
00131                 // add value added option
00132                 //------------------------------------
00133                 mImport->addRawItem ("RawData","Option \""+key+"\"","\""+val+"\"");
00134         }
00135 }
00136 
00137 //====================================
00138 // removeCardOption
00139 //------------------------------------
00140 void SaXManipulateCard::removeCardOption (const QString& value) {
00141         // .../
00145         // ----
00146         if (! mImport) {
00147                 return;
00148         }
00149         QString val (value);
00150         QString str = mImport->getItem("RawData");
00151         if (! str.contains ("\""+val+"\"")) {
00152                 //====================================
00153                 // remove bool option
00154                 //------------------------------------
00155                 mImport->removeItem ("Option",val);
00156         } else {
00157                 //====================================
00158                 // remove value added option
00159                 //------------------------------------
00160                 mImport->removeRawItem ("RawData","Option \""+val+"\"");
00161         }
00162 }
00163 
00164 //====================================
00165 // setBusID
00166 //------------------------------------
00167 void SaXManipulateCard::setBusID  (const QString& busid) {
00168         // .../
00170         // ----
00171         if (! mImport) {
00172                 return;
00173         }
00174         mImport -> setItem ("BusID",busid);
00175 }
00176 
00177 //====================================
00178 // setScreenID
00179 //------------------------------------
00180 void SaXManipulateCard::setScreenID (int screen) {
00181         // .../
00185         // ----
00186         if (! mImport) {
00187                 return;
00188         }
00189         QString screenID; screenID.sprintf ("%d",screen);
00190         mImport -> setItem ("Screen",screenID);
00191 }
00192 
00193 //====================================
00194 // setRotate
00195 //------------------------------------
00196 void SaXManipulateCard::setRotate (int direction) {
00197         // .../
00200         // ----
00201         if (! mImport) {
00202                 return;
00203         }
00204         if (direction == SAX_ROTATE_LEFT) {
00205                 mImport -> setItem ("Rotate","CCW");
00206         }
00207         if (direction == SAX_ROTATE_RIGHT) {
00208                 mImport -> setItem ("Rotate","CW");
00209         }
00210 }
00211 
00212 //====================================
00213 // getCardName
00214 //------------------------------------
00215 QString SaXManipulateCard::getCardName (void) {
00216         // .../
00219         // ----
00220         if (! mImport) {
00221                 return QString();
00222         }
00223         //====================================
00224         // search name in SYSP data
00225         //------------------------------------
00226         SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00227         pCard -> doImport();
00228         if (pCard -> setID ( mCard )) {
00229                 QString mCardName;
00230                 QTextOStream (&mCardName) <<
00231                         pCard->getItem("Vendor") << ":" << pCard->getItem("Device");
00232                 return mCardName;
00233         }
00234         //====================================
00235         // search name in ISAX data
00236         //------------------------------------
00237         QString mCardName;
00238         QTextOStream (&mCardName) <<
00239                 mImport->getItem("Vendor") << ":" << mImport->getItem("Name");
00240         return mCardName;
00241 }
00242 
00243 //====================================
00244 // getCardVendor
00245 //------------------------------------
00246 QString SaXManipulateCard::getCardVendor (void) {
00247         // .../
00250         // ----
00251         if (! mImport) {
00252                 return QString();
00253         }
00254         //====================================
00255         // search vendor in SYSP data
00256         //------------------------------------
00257         SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00258         pCard -> doImport();
00259         if (pCard -> setID ( mCard )) {
00260                 return pCard->getItem("Vendor");
00261         }
00262         //====================================
00263         // search vendor in ISAX data
00264         //------------------------------------
00265         return mImport->getItem("Vendor");
00266 }
00267 
00268 //====================================
00269 // getCardModel
00270 //------------------------------------
00271 QString SaXManipulateCard::getCardModel (void) {
00272         // .../
00275         // ----
00276         if (! mImport) {
00277                 return QString();
00278         }
00279         //====================================
00280         // search model in SYSP data
00281         //------------------------------------
00282         SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00283         pCard -> doImport();
00284         if (pCard -> setID ( mCard )) {
00285                 return pCard->getItem("Device");
00286         }
00287         //====================================
00288         // search model in ISAX data
00289         //------------------------------------
00290         return mImport->getItem("Name");
00291 }
00292 
00293 //====================================
00294 // getBusID
00295 //------------------------------------
00296 QString SaXManipulateCard::getBusID (void) {
00297         // .../
00300         // ----
00301         if (! mImport) {
00302                 return QString();
00303         }
00304         return mImport -> getItem ("BusID");
00305 }
00306 
00307 //====================================
00308 // getCardDriver
00309 //------------------------------------
00310 QString SaXManipulateCard::getCardDriver (void) {
00311         // .../
00314         // ----
00315         if (! mImport) {
00316                 return QString();
00317         }
00318         return mImport -> getItem ("Driver");
00319 }
00320 
00321 //====================================
00322 // getScreenID
00323 //------------------------------------
00324 QString SaXManipulateCard::getScreenID (void) {
00325         // .../
00328         // ----
00329         if (! mImport) {
00330                 return QString();
00331         }
00332         return mImport -> getItem ("Screen");
00333 }
00334 
00335 //====================================
00336 // getRotationDirection
00337 //------------------------------------
00338 QString SaXManipulateCard::getRotationDirection (void) {
00339         // .../
00343         // ---- 
00344         if (! mImport) {
00345                 return QString();
00346         }
00347         return mImport -> getItem ("Rotate");
00348 }
00349 
00350 //====================================
00351 // getOptions
00352 //------------------------------------
00353 QDict<QString> SaXManipulateCard::getOptions (void) {
00354         // .../
00360         // ----
00361         if (! mImport) {
00362                 return QDict<QString>();
00363         }
00364         QDict<QString> result;
00365         QString stdOptions = mImport -> getItem ("Option");
00366         QString rawOptions = mImport -> getItem ("RawData");
00367         //====================================
00368         // remove commented options from data
00369         //------------------------------------
00370         rawOptions.replace(
00371                 QRegExp("#Option  \"(.*)\" \"(.*)\""),""
00372         );
00373         //====================================
00374         // handle bool options
00375         //------------------------------------
00376         QStringList stdlist = QStringList::split ( ",", stdOptions );
00377         for ( QStringList::Iterator
00378                 in = stdlist.begin(); in != stdlist.end(); ++in
00379         ) {
00380                 QString item (*in);
00381                 result.insert (item,new QString);
00382         }
00383         //====================================
00384         // handle value added options
00385         //------------------------------------
00386         QStringList rawlist = QStringList::split ( "Option", rawOptions );
00387         for ( QStringList::Iterator
00388                 in = rawlist.begin(); in != rawlist.end(); ++in
00389         ) {
00390                 QString item (*in);
00391                 QRegExp itemExp ("\"(.*)\" \"(.*)\"");
00392                 int pos = itemExp.search (item);
00393                 if (pos >= 0) {
00394                         QString key = itemExp.cap(1);
00395                         QString* val = new QString (itemExp.cap(2));
00396                         result.insert (key,val);
00397                 }
00398         }
00399         return result;
00400 }
00401 
00402 //====================================
00403 // getCardDrivers
00404 //------------------------------------
00405 QList<QString> SaXManipulateCard::getCardDrivers ( void ) {
00406         // .../
00410         // ----
00411         mCDBCardDrivers.clear();
00412         if ( ! mCDBCardModules ) {
00413                 mCDBCardModules = new SaXProcess ();
00414                 mCDBCardModules -> start (CDB_CARDMODULES);
00415         }
00416         QDict< QDict<QString> > CDBModules = mCDBCardModules->getTablePointerCDB();
00417         QDictIterator< QDict<QString> > it (CDBModules);
00418         for (; it.current(); ++it) {
00419                 mCDBCardDrivers.append (new QString(it.currentKey()));
00420         }
00421         return mCDBCardDrivers;
00422 }
00423 
00424 //====================================
00425 // getCardOptions
00426 //------------------------------------
00427 QDict<QString> SaXManipulateCard::getCardOptions ( const QString& driver ) {
00428         // .../
00432         // ----
00433         mCDBCardOptions.clear();
00434         if ( ! mCDBCardModules ) {
00435                 mCDBCardModules = new SaXProcess ();
00436                 mCDBCardModules -> start (CDB_CARDMODULES);
00437         }
00438         QList< QDict<QString> > opts;
00439         opts = mCDBCardModules -> getTablePointerCDB_DATA (
00440                 driver
00441         );
00442         if (opts.isEmpty()) {
00443                 excCDBRecordNotFound (driver);
00444                 qError (errorString(),EXC_CDBRECORDNOTFOUND);
00445                 return QDict<QString>();
00446         }
00447         mCDBCardOptions = *opts.at(0);
00448         return mCDBCardOptions;
00449 }
00450 
00451 //====================================
00452 // isNoteBook
00453 //------------------------------------
00454 bool SaXManipulateCard::isNoteBook ( void ) {
00455         // .../
00459         // ----
00460         struct dirent* entry = NULL;
00461         DIR* batteryDir = NULL;
00462         batteryDir = opendir (ACPI_BATTERY);
00463         if (! batteryDir) {
00464                 return false;
00465         }
00466         int BATs = 0;
00467         while (1) {
00468                 entry = readdir (batteryDir);
00469                 if (! entry) {
00470                         break;
00471                 }
00472                 QString file (entry->d_name);
00473                 if ((file == ".") || (file == "..")) {
00474                         continue;
00475                 }
00476                 BATs++;
00477         }
00478         if (BATs == 0) {
00479                 return false;
00480         }
00481         return true;
00482 }
00483 
00484 //====================================
00485 // getCards
00486 //------------------------------------
00487 int SaXManipulateCard::getCards ( void ) {
00488         // .../
00492         // ----
00493         if (! mImport) {
00494                 return -1;
00495         }
00496         SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00497         pCard -> doImport();
00498         if (pCard->getItem("Detected")) {
00499                 return pCard->getItem("Detected").toInt();
00500         }
00501         return -1;
00502 }
00503 
00504 //====================================
00505 // getDevices
00506 //------------------------------------
00507 int SaXManipulateCard::getDevices ( void ) {
00508         // .../
00514         // ----
00515         if (! mImport) {
00516                 return -1;
00517         }
00518         return mImport->getCount();
00519 }
00520 
00521 //====================================
00522 // getHeads
00523 //------------------------------------
00524 int SaXManipulateCard::getHeads ( void ) {
00525         // .../
00529         // ----
00530         if (! mImport) {
00531                 return -1;
00532         }
00533         int mBoards  = getCards();
00534         int mDevices = mImport -> getCount();
00535         //====================================
00536         // check for NoteBooks, assume *2
00537         //------------------------------------
00538         if ( isNoteBook() ) {
00539                 return mBoards * 2;
00540         }
00541         //====================================
00542         // get sysp card name
00543         //------------------------------------
00544         SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00545         pCard -> doImport();
00546         QString mCardName;
00547         QTextOStream (&mCardName) <<
00548                 pCard->getItem("Vendor") << ":" << pCard->getItem("Device");
00549         //====================================
00550         // import CDB DB for profile names
00551         //------------------------------------
00552         SaXProcess* pCDB = new SaXProcess();
00553         pCDB -> start ( CDB_CARDS );
00554         QDict< QDict<QString> > CDBData = pCDB -> getTablePointerCDB();
00555         //====================================
00556         // check profile names
00557         //------------------------------------
00558         int headCount = 0;
00559         int realCount = 0;
00560         int currentCard = mCard;
00561         while (1) {
00562                 if (realCount >= mDevices) {
00563                         selectCard (currentCard);
00564                         return headCount;
00565                 }
00566                 selectCard (realCount);
00567                 if ( CDBData[mCardName] ) {
00568                         QDict<QString> CDBTable = *CDBData[mCardName];
00569                         if (CDBTable["Profile"]) {
00570                                 QString mProfile = *CDBTable["Profile"];
00571                                 if (mProfile == "NVidia_DualHead_DriverOptions") {
00572                                         headCount += 2;
00573                                         realCount += 1;
00574                                         continue;
00575                                 }
00576                                 if (mProfile == "NVidia_DualHead") {
00577                                         headCount += 2;
00578                                         realCount += 2;
00579                                         continue;
00580                                 }
00581                                 if (mProfile == "Radeon_DualHead_DriverOptions") {
00582                                         headCount += 2;
00583                                         realCount += 1;
00584                                         continue;
00585                                 }
00586                                 if (mProfile == "Radeon_DualHead") {
00587                                         headCount += 2;
00588                                         realCount += 2;
00589                                         continue;
00590                                 }
00591                                 if (mProfile == "FGLRX_DualHead_DriverOptions") {
00592                                         headCount += 2;
00593                                         realCount += 1;
00594                                         continue;
00595                                 }
00596                                 if (mProfile == "FGLRX_DualHead") {
00597                                         headCount += 2;
00598                                         realCount += 2;
00599                                         continue;
00600                                 }
00601                                 if (mProfile == "Intel_DualHead_DriverOptions") {
00602                                         headCount += 2;
00603                                         realCount += 1;
00604                                         continue;
00605                                 }
00606                                 if (mProfile == "Intel_DualHead") {
00607                                         headCount += 2;
00608                                         realCount += 2;
00609                                         continue;
00610                                 }
00611                                 if (mProfile == "Matrox_DualHead_DriverOptions") {
00612                                         headCount += 2;
00613                                         realCount += 1;
00614                                         continue;
00615                                 }
00616                                 if (mProfile == "Matrox_DualHead") {
00617                                         headCount += 2;
00618                                         realCount += 2;
00619                                         continue;
00620                                 }
00621                         }
00622                 }
00623                 realCount++;
00624                 headCount++;
00625         }
00626         //====================================
00627         // return board count, last chance
00628         //------------------------------------
00629         return mBoards;
00630 }
00631 } // end namespace

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