00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "card.h"
00022
00023 namespace SaX {
00024
00025
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
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
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
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
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
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
00146
00147 mImport->setItem ("Option",key);
00148 } else {
00149
00150
00151
00152 mImport->setRawItem ("RawData","Option \""+key+"\"","\""+val+"\"");
00153 }
00154 }
00155
00156
00157
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
00174
00175 mImport->addItem ("Option",key);
00176 } else {
00177
00178
00179
00180 mImport->addRawItem ("RawData","Option \""+key+"\"","\""+val+"\"");
00181 }
00182 }
00183
00184
00185
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
00201
00202 mImport->removeItem ("Option",val);
00203 } else {
00204
00205
00206
00207 mImport->removeRawItem ("RawData","Option \""+val+"\"");
00208 }
00209 }
00210
00211
00212
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
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
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
00261
00262 QString SaXManipulateCard::getCardName (void) {
00263
00266
00267 if (! mImport) {
00268 QString* nope = new QString;
00269 return *nope;
00270 }
00271
00272
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
00284
00285 QString mCardName;
00286 QTextOStream (&mCardName) <<
00287 mImport->getItem("Vendor") << ":" << mImport->getItem("Name");
00288 return mCardName;
00289 }
00290
00291
00292
00293
00294 QString SaXManipulateCard::getCardVendor (void) {
00295
00298
00299 if (! mImport) {
00300 QString* nope = new QString;
00301 return *nope;
00302 }
00303
00304
00305
00306 SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00307 pCard -> doImport();
00308 if (pCard -> setID ( mCard )) {
00309 return pCard->getItem("Vendor");
00310 }
00311
00312
00313
00314 return mImport->getItem("Vendor");
00315 }
00316
00317
00318
00319
00320 QString SaXManipulateCard::getCardModel (void) {
00321
00324
00325 if (! mImport) {
00326 QString* nope = new QString;
00327 return *nope;
00328 }
00329
00330
00331
00332 SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00333 pCard -> doImport();
00334 if (pCard -> setID ( mCard )) {
00335 return pCard->getItem("Device");
00336 }
00337
00338
00339
00340 return mImport->getItem("Name");
00341 }
00342
00343
00344
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
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
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
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
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
00424
00425 rawOptions.replace(
00426 QRegExp("#Option \"(.*)\" \"(.*)\""),""
00427 );
00428
00429
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
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
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
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
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
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
00572
00573 int SaXManipulateCard::getDevices ( void ) {
00574
00580
00581 if (! mImport) {
00582 return -1;
00583 }
00584 return mImport->getCount();
00585 }
00586
00587
00588
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
00603
00604 if ( isNoteBook() ) {
00605 return mBoards * 2;
00606 }
00607
00608
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
00617
00618 SaXProcess* pCDB = new SaXProcess();
00619 pCDB -> start ( CDB_CARDS );
00620 Q3Dict< Q3Dict<QString> > CDBData = pCDB -> getTablePointerCDB();
00621
00622
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
00714
00715 return mBoards;
00716 }
00717 }