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::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
00099
00100 mImport->setItem ("Option",key);
00101 } else {
00102
00103
00104
00105 mImport->setRawItem ("RawData","Option \""+key+"\"","\""+val+"\"");
00106 }
00107 }
00108
00109
00110
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
00127
00128 mImport->addItem ("Option",key);
00129 } else {
00130
00131
00132
00133 mImport->addRawItem ("RawData","Option \""+key+"\"","\""+val+"\"");
00134 }
00135 }
00136
00137
00138
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
00154
00155 mImport->removeItem ("Option",val);
00156 } else {
00157
00158
00159
00160 mImport->removeRawItem ("RawData","Option \""+val+"\"");
00161 }
00162 }
00163
00164
00165
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
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
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
00214
00215 QString SaXManipulateCard::getCardName (void) {
00216
00219
00220 if (! mImport) {
00221 return QString();
00222 }
00223
00224
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
00236
00237 QString mCardName;
00238 QTextOStream (&mCardName) <<
00239 mImport->getItem("Vendor") << ":" << mImport->getItem("Name");
00240 return mCardName;
00241 }
00242
00243
00244
00245
00246 QString SaXManipulateCard::getCardVendor (void) {
00247
00250
00251 if (! mImport) {
00252 return QString();
00253 }
00254
00255
00256
00257 SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00258 pCard -> doImport();
00259 if (pCard -> setID ( mCard )) {
00260 return pCard->getItem("Vendor");
00261 }
00262
00263
00264
00265 return mImport->getItem("Vendor");
00266 }
00267
00268
00269
00270
00271 QString SaXManipulateCard::getCardModel (void) {
00272
00275
00276 if (! mImport) {
00277 return QString();
00278 }
00279
00280
00281
00282 SaXImportSysp* pCard = new SaXImportSysp (SYSP_CARD);
00283 pCard -> doImport();
00284 if (pCard -> setID ( mCard )) {
00285 return pCard->getItem("Device");
00286 }
00287
00288
00289
00290 return mImport->getItem("Name");
00291 }
00292
00293
00294
00295
00296 QString SaXManipulateCard::getBusID (void) {
00297
00300
00301 if (! mImport) {
00302 return QString();
00303 }
00304 return mImport -> getItem ("BusID");
00305 }
00306
00307
00308
00309
00310 QString SaXManipulateCard::getCardDriver (void) {
00311
00314
00315 if (! mImport) {
00316 return QString();
00317 }
00318 return mImport -> getItem ("Driver");
00319 }
00320
00321
00322
00323
00324 QString SaXManipulateCard::getScreenID (void) {
00325
00328
00329 if (! mImport) {
00330 return QString();
00331 }
00332 return mImport -> getItem ("Screen");
00333 }
00334
00335
00336
00337
00338 QString SaXManipulateCard::getRotationDirection (void) {
00339
00343
00344 if (! mImport) {
00345 return QString();
00346 }
00347 return mImport -> getItem ("Rotate");
00348 }
00349
00350
00351
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
00369
00370 rawOptions.replace(
00371 QRegExp("#Option \"(.*)\" \"(.*)\""),""
00372 );
00373
00374
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
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
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
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
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
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
00506
00507 int SaXManipulateCard::getDevices ( void ) {
00508
00514
00515 if (! mImport) {
00516 return -1;
00517 }
00518 return mImport->getCount();
00519 }
00520
00521
00522
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
00537
00538 if ( isNoteBook() ) {
00539 return mBoards * 2;
00540 }
00541
00542
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
00551
00552 SaXProcess* pCDB = new SaXProcess();
00553 pCDB -> start ( CDB_CARDS );
00554 QDict< QDict<QString> > CDBData = pCDB -> getTablePointerCDB();
00555
00556
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
00628
00629 return mBoards;
00630 }
00631 }