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 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
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
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
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) {
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 return QString();
00269 }
00270
00271
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
00283
00284 QString mCardName;
00285 QTextOStream (&mCardName) <<
00286 mImport->getItem("Vendor") << ":" << mImport->getItem("Name");
00287 return mCardName;
00288 }
00289
00290
00291
00292
00293 QString SaXManipulateCard::getCardVendor (void) {
00294
00297
00298 if (! mImport) {
00299 return QString();
00300 }
00301
00302
00303
00304 SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00305 pCard -> doImport();
00306 if (pCard -> setID ( mCard )) {
00307 return pCard->getItem("Vendor");
00308 }
00309
00310
00311
00312 return mImport->getItem("Vendor");
00313 }
00314
00315
00316
00317
00318 QString SaXManipulateCard::getCardModel (void) {
00319
00322
00323 if (! mImport) {
00324 return QString();
00325 }
00326
00327
00328
00329 SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00330 pCard -> doImport();
00331 if (pCard -> setID ( mCard )) {
00332 return pCard->getItem("Device");
00333 }
00334
00335
00336
00337 return mImport->getItem("Name");
00338 }
00339
00340
00341
00342
00343 QString SaXManipulateCard::getBusID (void) {
00344
00347
00348 if (! mImport) {
00349 return QString();
00350 }
00351 return mImport -> getItem ("BusID");
00352 }
00353
00354
00355
00356
00357 QString SaXManipulateCard::getCardDriver (void) {
00358
00361
00362 if (! mImport) {
00363 return QString();
00364 }
00365 return mImport -> getItem ("Driver");
00366 }
00367
00368
00369
00370
00371 QString SaXManipulateCard::getScreenID (void) {
00372
00375
00376 if (! mImport) {
00377 return QString();
00378 }
00379 return mImport -> getItem ("Screen");
00380 }
00381
00382
00383
00384
00385 QString SaXManipulateCard::getRotationDirection (void) {
00386
00390
00391 if (! mImport) {
00392 return QString();
00393 }
00394 return mImport -> getItem ("Rotate");
00395 }
00396
00397
00398
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
00416
00417 rawOptions.replace(
00418 QRegExp("#Option \"(.*)\" \"(.*)\""),""
00419 );
00420
00421
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
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
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
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
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
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
00563
00564 int SaXManipulateCard::getDevices ( void ) {
00565
00571
00572 if (! mImport) {
00573 return -1;
00574 }
00575 return mImport->getCount();
00576 }
00577
00578
00579
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
00594
00595 if ( isNoteBook() ) {
00596 return mBoards * 2;
00597 }
00598
00599
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
00608
00609 SaXProcess* pCDB = new SaXProcess();
00610 pCDB -> start ( CDB_CARDS );
00611 QDict< QDict<QString> > CDBData = pCDB -> getTablePointerCDB();
00612
00613
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
00705
00706 return mBoards;
00707 }
00708 }