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         QDict<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         QDict<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) {
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) {
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                 return QString();
00269         }
00270         //====================================
00271         // search name in SYSP data
00272         //------------------------------------
00273         SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00274         pCard -> doImport();
00275         if (pCard -> setID ( mCard )) {
00276                 QString mCardName;
00277                 QTextOStream (&mCardName) <<
00278                         pCard->getItem("Vendor") << ":" << pCard->getItem("Device");
00279                 return mCardName;
00280         }
00281         //====================================
00282         // search name in ISAX data
00283         //------------------------------------
00284         QString mCardName;
00285         QTextOStream (&mCardName) <<
00286                 mImport->getItem("Vendor") << ":" << mImport->getItem("Name");
00287         return mCardName;
00288 }
00289 
00290 //====================================
00291 // getCardVendor
00292 //------------------------------------
00293 QString SaXManipulateCard::getCardVendor (void) {
00294         // .../
00297         // ----
00298         if (! mImport) {
00299                 return QString();
00300         }
00301         //====================================
00302         // search vendor in SYSP data
00303         //------------------------------------
00304         SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00305         pCard -> doImport();
00306         if (pCard -> setID ( mCard )) {
00307                 return pCard->getItem("Vendor");
00308         }
00309         //====================================
00310         // search vendor in ISAX data
00311         //------------------------------------
00312         return mImport->getItem("Vendor");
00313 }
00314 
00315 //====================================
00316 // getCardModel
00317 //------------------------------------
00318 QString SaXManipulateCard::getCardModel (void) {
00319         // .../
00322         // ----
00323         if (! mImport) {
00324                 return QString();
00325         }
00326         //====================================
00327         // search model in SYSP data
00328         //------------------------------------
00329         SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00330         pCard -> doImport();
00331         if (pCard -> setID ( mCard )) {
00332                 return pCard->getItem("Device");
00333         }
00334         //====================================
00335         // search model in ISAX data
00336         //------------------------------------
00337         return mImport->getItem("Name");
00338 }
00339 
00340 //====================================
00341 // getBusID
00342 //------------------------------------
00343 QString SaXManipulateCard::getBusID (void) {
00344         // .../
00347         // ----
00348         if (! mImport) {
00349                 return QString();
00350         }
00351         return mImport -> getItem ("BusID");
00352 }
00353 
00354 //====================================
00355 // getCardDriver
00356 //------------------------------------
00357 QString SaXManipulateCard::getCardDriver (void) {
00358         // .../
00361         // ----
00362         if (! mImport) {
00363                 return QString();
00364         }
00365         return mImport -> getItem ("Driver");
00366 }
00367 
00368 //====================================
00369 // getScreenID
00370 //------------------------------------
00371 QString SaXManipulateCard::getScreenID (void) {
00372         // .../
00375         // ----
00376         if (! mImport) {
00377                 return QString();
00378         }
00379         return mImport -> getItem ("Screen");
00380 }
00381 
00382 //====================================
00383 // getRotationDirection
00384 //------------------------------------
00385 QString SaXManipulateCard::getRotationDirection (void) {
00386         // .../
00390         // ---- 
00391         if (! mImport) {
00392                 return QString();
00393         }
00394         return mImport -> getItem ("Rotate");
00395 }
00396 
00397 //====================================
00398 // getOptions
00399 //------------------------------------
00400 QDict<QString> SaXManipulateCard::getOptions (void) {
00401         // .../
00407         // ----
00408         if (! mImport) {
00409                 return QDict<QString>();
00410         }
00411         QDict<QString> result;
00412         QString stdOptions = mImport -> getItem ("Option");
00413         QString rawOptions = mImport -> getItem ("RawData");
00414         //====================================
00415         // remove commented options from data
00416         //------------------------------------
00417         rawOptions.replace(
00418                 QRegExp("#Option  \"(.*)\" \"(.*)\""),""
00419         );
00420         //====================================
00421         // handle bool options
00422         //------------------------------------
00423         QStringList stdlist = QStringList::split ( ",", stdOptions );
00424         for ( QStringList::Iterator
00425                 in = stdlist.begin(); in != stdlist.end(); ++in
00426         ) {
00427                 QString item (*in);
00428                 result.insert (item,new QString);
00429         }
00430         //====================================
00431         // handle value added options
00432         //------------------------------------
00433         QStringList rawlist = QStringList::split ( "Option", rawOptions );
00434         for ( QStringList::Iterator
00435                 in = rawlist.begin(); in != rawlist.end(); ++in
00436         ) {
00437                 QString item (*in);
00438                 QRegExp itemExp ("\"(.*)\" \"(.*)\"");
00439                 int pos = itemExp.search (item);
00440                 if (pos >= 0) {
00441                         QString key = itemExp.cap(1);
00442                         QString* val = new QString (itemExp.cap(2));
00443                         result.insert (key,val);
00444                 }
00445         }
00446         return result;
00447 }
00448 
00449 //====================================
00450 // getCardDrivers
00451 //------------------------------------
00452 QList<QString> SaXManipulateCard::getCardDrivers ( void ) {
00453         // .../
00457         // ----
00458         mCDBCardDrivers.clear();
00459         if ( ! mCDBCardModules ) {
00460                 mCDBCardModules = new SaXProcess ();
00461                 mCDBCardModules -> start (CDB_CARDMODULES);
00462         }
00463         QDict< QDict<QString> > CDBModules = mCDBCardModules->getTablePointerCDB();
00464         QDictIterator< QDict<QString> > it (CDBModules);
00465         for (; it.current(); ++it) {
00466                 mCDBCardDrivers.append (new QString(it.currentKey()));
00467         }
00468         return mCDBCardDrivers;
00469 }
00470 
00471 //====================================
00472 // getCardOptions
00473 //------------------------------------
00474 QDict<QString> SaXManipulateCard::getCardOptions ( const QString& driver ) {
00475         // .../
00479         // ----
00480         mCDBCardOptions.clear();
00481         if ( ! mCDBCardModules ) {
00482                 mCDBCardModules = new SaXProcess ();
00483                 mCDBCardModules -> start (CDB_CARDMODULES);
00484         }
00485         QList< QDict<QString> > opts;
00486         opts = mCDBCardModules -> getTablePointerCDB_DATA (
00487                 driver
00488         );
00489         if (opts.isEmpty()) {
00490                 excCDBRecordNotFound (driver);
00491                 qError (errorString(),EXC_CDBRECORDNOTFOUND);
00492                 return QDict<QString>();
00493         }
00494         QList< QDict<QString> > xaaopts;
00495         xaaopts = mCDBCardModules -> getTablePointerCDB_DATA (
00496                 "xaa"
00497         );
00498         mCDBCardOptions = *opts.at(0);
00499         if (!xaaopts.isEmpty()) {
00500                 QDictIterator<QString> it (*xaaopts.at(0));
00501                 for (; it.current(); ++it) {
00502                         mCDBCardOptions.insert (it.currentKey(),it.current());
00503                 }
00504         }
00505         return mCDBCardOptions;
00506 }
00507 
00508 //====================================
00509 // isNoteBook
00510 //------------------------------------
00511 bool SaXManipulateCard::isNoteBook ( void ) {
00512         // .../
00516         // ----
00517         struct dirent* entry = NULL;
00518         DIR* batteryDir = NULL;
00519         batteryDir = opendir (ACPI_BATTERY);
00520         if (! batteryDir) {
00521                 return false;
00522         }
00523         int BATs = 0;
00524         while (1) {
00525                 entry = readdir (batteryDir);
00526                 if (! entry) {
00527                         break;
00528                 }
00529                 QString file (entry->d_name);
00530                 if ((file == ".") || (file == "..")) {
00531                         continue;
00532                 }
00533                 BATs++;
00534         }
00535         if (BATs == 0) {
00536                 return false;
00537         }
00538         return true;
00539 }
00540 
00541 //====================================
00542 // getCards
00543 //------------------------------------
00544 int SaXManipulateCard::getCards ( void ) {
00545         // .../
00549         // ----
00550         if (! mImport) {
00551                 return -1;
00552         }
00553         SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00554         pCard -> doImport();
00555         if (pCard->getItem("Detected")) {
00556                 return pCard->getItem("Detected").toInt();
00557         }
00558         return -1;
00559 }
00560 
00561 //====================================
00562 // getDevices
00563 //------------------------------------
00564 int SaXManipulateCard::getDevices ( void ) {
00565         // .../
00571         // ----
00572         if (! mImport) {
00573                 return -1;
00574         }
00575         return mImport->getCount();
00576 }
00577 
00578 //====================================
00579 // getHeads
00580 //------------------------------------
00581 int SaXManipulateCard::getHeads ( void ) {
00582         // .../
00586         // ----
00587         if (! mImport) {
00588                 return -1;
00589         }
00590         int mBoards  = getCards();
00591         int mDevices = mImport -> getCount();
00592         //====================================
00593         // check for NoteBooks, assume *2
00594         //------------------------------------
00595         if ( isNoteBook() ) {
00596                 return mBoards * 2;
00597         }
00598         //====================================
00599         // get sysp card name
00600         //------------------------------------
00601         SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00602         pCard -> doImport();
00603         QString mCardName;
00604         QTextOStream (&mCardName) <<
00605                 pCard->getItem("Vendor") << ":" << pCard->getItem("Device");
00606         //====================================
00607         // import CDB DB for profile names
00608         //------------------------------------
00609         SaXProcess* pCDB = new SaXProcess();
00610         pCDB -> start ( CDB_CARDS );
00611         QDict< QDict<QString> > CDBData = pCDB -> getTablePointerCDB();
00612         //====================================
00613         // check profile names
00614         //------------------------------------
00615         int headCount = 0;
00616         int realCount = 0;
00617         int currentCard = mCard;
00618         while (1) {
00619                 if (realCount >= mDevices) {
00620                         selectCard (currentCard);
00621                         return headCount;
00622                 }
00623                 selectCard (realCount);
00624                 if ( CDBData[mCardName] ) {
00625                         QDict<QString> CDBTable = *CDBData[mCardName];
00626                         if (CDBTable["Profile"]) {
00627                                 QString mProfile = *CDBTable["Profile"];
00628                                 if (mProfile == "NVidia_DualHead_DriverOptions") {
00629                                         headCount += 2;
00630                                         realCount += 1;
00631                                         continue;
00632                                 }
00633                                 if (mProfile == "NVidia_DualHead") {
00634                                         headCount += 2;
00635                                         realCount += 2;
00636                                         continue;
00637                                 }
00638                                 if (mProfile == "Radeon_DualHead_DriverOptions") {
00639                                         headCount += 2;
00640                                         realCount += 1;
00641                                         continue;
00642                                 }
00643                                 if (mProfile == "Radeon_DualHead") {
00644                                         headCount += 2;
00645                                         realCount += 2;
00646                                         continue;
00647                                 }
00648                                 if (mProfile == "FGLRX_DualHead_DriverOptions") {
00649                                         headCount += 2;
00650                                         realCount += 1;
00651                                         continue;
00652                                 }
00653                                 if (mProfile == "FGLRX_DualHead") {
00654                                         headCount += 2;
00655                                         realCount += 2;
00656                                         continue;
00657                                 }
00658                                 if (mProfile == "Intel_DualHead_DriverOptions") {
00659                                         headCount += 2;
00660                                         realCount += 1;
00661                                         continue;
00662                                 }
00663                                 if (mProfile == "Intel_DualHead") {
00664                                         headCount += 2;
00665                                         realCount += 2;
00666                                         continue;
00667                                 }
00668                                 if (mProfile == "IntelNext_DualHead") {
00669                                         headCount += 2;
00670                                         realCount += 2;
00671                                         continue;
00672                                 }
00673                                 if (mProfile == "IntelNext_DualHead_DriverOptions") {
00674                                         headCount += 2;
00675                                         realCount += 1;
00676                                         continue;
00677                                 }       
00678                                 if (mProfile == "Matrox_DualHead_DriverOptions") {
00679                                         headCount += 2;
00680                                         realCount += 1;
00681                                         continue;
00682                                 }
00683                                 if (mProfile == "Matrox_DualHead") {
00684                                         headCount += 2;
00685                                         realCount += 2;
00686                                         continue;
00687                                 }
00688                                 if (mProfile == "SiS_DualHead_DriverOptions") {
00689                                         headCount += 2;
00690                                         realCount += 1;
00691                                         continue;
00692                                 }
00693                                 if (mProfile == "SiS_DualHead") {
00694                                         headCount += 2;
00695                                         realCount += 2;
00696                                         continue;
00697                                 }
00698                         }
00699                 }
00700                 realCount++;
00701                 headCount++;
00702         }
00703         //====================================
00704         // return board count, last chance
00705         //------------------------------------
00706         return mBoards;
00707 }
00708 } // end namespace

Generated on Tue Sep 25 20:18:16 2007 for libsax by  doxygen 1.5.3