|
libsax 7.2
|
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
1.7.3