00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00021
00022 #include "myth.h"
00023
00024 #include <QDir>
00025 #include <QCryptographicHash>
00026 #include <QHostAddress>
00027 #include <QUdpSocket>
00028
00029 #include "version.h"
00030 #include "mythversion.h"
00031 #include "mythcorecontext.h"
00032 #include "mythdbcon.h"
00033 #include "mythlogging.h"
00034 #include "storagegroup.h"
00035 #include "dbutil.h"
00036 #include "hardwareprofile.h"
00037 #include "mythmiscutil.h"
00038
00040
00042
00043 DTC::ConnectionInfo* Myth::GetConnectionInfo( const QString &sPin )
00044 {
00045 QString sSecurityPin = gCoreContext->GetSetting( "SecurityPin", "");
00046
00047 if ( sSecurityPin.isEmpty() )
00048 throw( QString( "No Security Pin assigned. Run mythtv-setup to set one." ));
00049
00050
00051 if ((sSecurityPin != "0000" ) && ( sPin != sSecurityPin ))
00052 throw( QString( "Not Authorized" ));
00053
00054
00055 DatabaseParams params = gCoreContext->GetDatabaseParams();
00056
00057
00058
00059
00060
00061 QString sServerIP = gCoreContext->GetSetting( "BackendServerIP", "localhost" );
00062
00063
00064 if ((params.dbHostName == "localhost") &&
00065 (sServerIP != "localhost"))
00066
00067 {
00068 params.dbHostName = sServerIP;
00069 }
00070
00071
00072
00073
00074
00075 DTC::ConnectionInfo *pInfo = new DTC::ConnectionInfo();
00076 DTC::DatabaseInfo *pDatabase = pInfo->Database();
00077 DTC::WOLInfo *pWOL = pInfo->WOL();
00078 DTC::VersionInfo *pVersion = pInfo->Version();
00079
00080 pDatabase->setHost ( params.dbHostName );
00081 pDatabase->setPing ( params.dbHostPing );
00082 pDatabase->setPort ( params.dbPort );
00083 pDatabase->setUserName ( params.dbUserName );
00084 pDatabase->setPassword ( params.dbPassword );
00085 pDatabase->setName ( params.dbName );
00086 pDatabase->setType ( params.dbType );
00087 pDatabase->setLocalEnabled ( params.localEnabled );
00088 pDatabase->setLocalHostName( params.localHostName );
00089
00090 pWOL->setEnabled ( params.wolEnabled );
00091 pWOL->setReconnect ( params.wolReconnect );
00092 pWOL->setRetry ( params.wolRetry );
00093 pWOL->setCommand ( params.wolCommand );
00094
00095 pVersion->setVersion ( MYTH_SOURCE_VERSION );
00096 pVersion->setBranch ( MYTH_SOURCE_PATH );
00097 pVersion->setProtocol ( MYTH_PROTO_VERSION );
00098 pVersion->setBinary ( MYTH_BINARY_VERSION );
00099 pVersion->setSchema ( MYTH_DATABASE_VERSION );
00100
00101
00102
00103
00104
00105 return pInfo;
00106 }
00107
00109
00111
00112 QString Myth::GetHostName( )
00113 {
00114 if (!gCoreContext)
00115 throw( QString( "No MythCoreContext in GetHostName." ));
00116
00117 return gCoreContext->GetHostName();
00118 }
00120
00122
00123 QStringList Myth::GetHosts( )
00124 {
00125 MSqlQuery query(MSqlQuery::InitCon());
00126
00127 if (!query.isConnected())
00128 throw( QString( "Database not open while trying to load list of hosts" ));
00129
00130 query.prepare(
00131 "SELECT DISTINCTROW hostname "
00132 "FROM settings "
00133 "WHERE (not isNull( hostname ))");
00134
00135 if (!query.exec())
00136 {
00137 MythDB::DBError("MythAPI::GetHosts()", query);
00138
00139 throw( QString( "Database Error executing query." ));
00140 }
00141
00142
00143
00144
00145
00146 QStringList oList;
00147
00148 while (query.next())
00149 oList.append( query.value(0).toString() );
00150
00151 return oList;
00152 }
00153
00155
00157
00158 QStringList Myth::GetKeys()
00159 {
00160 MSqlQuery query(MSqlQuery::InitCon());
00161
00162 if (!query.isConnected())
00163 throw( QString("Database not open while trying to load settings"));
00164
00165 query.prepare("SELECT DISTINCTROW value FROM settings;" );
00166
00167 if (!query.exec())
00168 {
00169 MythDB::DBError("MythAPI::GetKeys()", query);
00170
00171 throw( QString( "Database Error executing query." ));
00172 }
00173
00174
00175
00176
00177
00178 QStringList oResults;
00179
00180
00181
00182 while (query.next())
00183 oResults.append( query.value(0).toString() );
00184
00185 return oResults;
00186 }
00187
00189
00191
00192 DTC::StorageGroupDirList *Myth::GetStorageGroupDirs( const QString &sGroupName,
00193 const QString &sHostName )
00194 {
00195 MSqlQuery query(MSqlQuery::InitCon());
00196
00197 if (!query.isConnected())
00198 throw( QString("Database not open while trying to list "
00199 "Storage Group Dirs"));
00200
00201 if (!sGroupName.isEmpty() && !sHostName.isEmpty())
00202 {
00203 query.prepare("SELECT id, groupname, hostname, dirname "
00204 "FROM storagegroup "
00205 "WHERE groupname = :GROUP AND hostname = :HOST "
00206 "ORDER BY groupname, hostname, dirname" );
00207 query.bindValue(":HOST", sHostName);
00208 query.bindValue(":GROUP", sGroupName);
00209 }
00210 else if (!sHostName.isEmpty())
00211 {
00212 query.prepare("SELECT id, groupname, hostname, dirname "
00213 "FROM storagegroup "
00214 "WHERE hostname = :HOST "
00215 "ORDER BY groupname, hostname, dirname" );
00216 query.bindValue(":HOST", sHostName);
00217 }
00218 else if (!sGroupName.isEmpty())
00219 {
00220 query.prepare("SELECT id, groupname, hostname, dirname "
00221 "FROM storagegroup "
00222 "WHERE groupname = :GROUP "
00223 "ORDER BY groupname, hostname, dirname" );
00224 query.bindValue(":GROUP", sGroupName);
00225 }
00226 else
00227 query.prepare("SELECT id, groupname, hostname, dirname "
00228 "FROM storagegroup "
00229 "ORDER BY groupname, hostname, dirname" );
00230
00231 if (!query.exec())
00232 {
00233 MythDB::DBError("MythAPI::GetStorageGroupDirs()", query);
00234
00235 throw( QString( "Database Error executing query." ));
00236 }
00237
00238
00239
00240
00241
00242 DTC::StorageGroupDirList* pList = new DTC::StorageGroupDirList();
00243
00244 while (query.next())
00245 {
00246 DTC::StorageGroupDir *pStorageGroupDir = pList->AddNewStorageGroupDir();
00247
00248 pStorageGroupDir->setId ( query.value(0).toInt() );
00249 pStorageGroupDir->setGroupName ( query.value(1).toString() );
00250 pStorageGroupDir->setHostName ( query.value(2).toString() );
00251 pStorageGroupDir->setDirName ( query.value(3).toString() );
00252 }
00253
00254 return pList;
00255 }
00256
00258
00260
00261 bool Myth::AddStorageGroupDir( const QString &sGroupName,
00262 const QString &sDirName,
00263 const QString &sHostName )
00264 {
00265 MSqlQuery query(MSqlQuery::InitCon());
00266
00267 if (!query.isConnected())
00268 throw( QString("Database not open while trying to add Storage Group "
00269 "dir"));
00270
00271 if (sGroupName.isEmpty())
00272 throw ( QString( "Storage Group Required" ));
00273
00274 if (sDirName.isEmpty())
00275 throw ( QString( "Directory Name Required" ));
00276
00277 if (sHostName.isEmpty())
00278 throw ( QString( "HostName Required" ));
00279
00280 query.prepare("SELECT COUNT(*) "
00281 "FROM storagegroup "
00282 "WHERE groupname = :GROUPNAME "
00283 "AND dirname = :DIRNAME "
00284 "AND hostname = :HOSTNAME;");
00285 query.bindValue(":GROUPNAME", sGroupName );
00286 query.bindValue(":DIRNAME" , sDirName );
00287 query.bindValue(":HOSTNAME" , sHostName );
00288 if (!query.exec())
00289 {
00290 MythDB::DBError("MythAPI::AddStorageGroupDir()", query);
00291
00292 throw( QString( "Database Error executing query." ));
00293 }
00294
00295 if (query.next())
00296 {
00297 if (query.value(0).toInt() > 0)
00298 return false;
00299 }
00300
00301 query.prepare("INSERT storagegroup "
00302 "( groupname, dirname, hostname ) "
00303 "VALUES "
00304 "( :GROUPNAME, :DIRNAME, :HOSTNAME );");
00305 query.bindValue(":GROUPNAME", sGroupName );
00306 query.bindValue(":DIRNAME" , sDirName );
00307 query.bindValue(":HOSTNAME" , sHostName );
00308
00309 if (!query.exec())
00310 {
00311 MythDB::DBError("MythAPI::AddStorageGroupDir()", query);
00312
00313 throw( QString( "Database Error executing query." ));
00314 }
00315
00316 return true;
00317 }
00318
00320
00322
00323 bool Myth::RemoveStorageGroupDir( const QString &sGroupName,
00324 const QString &sDirName,
00325 const QString &sHostName )
00326 {
00327 MSqlQuery query(MSqlQuery::InitCon());
00328
00329 if (!query.isConnected())
00330 throw( QString("Database not open while trying to remove Storage "
00331 "Group dir"));
00332
00333 if (sGroupName.isEmpty())
00334 throw ( QString( "Storage Group Required" ));
00335
00336 if (sDirName.isEmpty())
00337 throw ( QString( "Directory Name Required" ));
00338
00339 if (sHostName.isEmpty())
00340 throw ( QString( "HostName Required" ));
00341
00342 query.prepare("DELETE "
00343 "FROM storagegroup "
00344 "WHERE groupname = :GROUPNAME "
00345 "AND dirname = :DIRNAME "
00346 "AND hostname = :HOSTNAME;");
00347 query.bindValue(":GROUPNAME", sGroupName );
00348 query.bindValue(":DIRNAME" , sDirName );
00349 query.bindValue(":HOSTNAME" , sHostName );
00350 if (!query.exec())
00351 {
00352 MythDB::DBError("MythAPI::AddStorageGroupDir()", query);
00353
00354 throw( QString( "Database Error executing query." ));
00355 }
00356
00357 return true;
00358 }
00359
00361
00363
00364 DTC::TimeZoneInfo *Myth::GetTimeZone( )
00365 {
00366 DTC::TimeZoneInfo *pResults = new DTC::TimeZoneInfo();
00367
00368 pResults->setTimeZoneID( getTimeZoneID() );
00369 pResults->setUTCOffset( calc_utc_offset() );
00370 pResults->setCurrentDateTime( mythCurrentDateTime() );
00371
00372 return pResults;
00373 }
00374
00376
00378
00379 DTC::LogMessageList *Myth::GetLogs( const QString &HostName,
00380 const QString &Application,
00381 int PID,
00382 int TID,
00383 const QString &Thread,
00384 const QString &Filename,
00385 int Line,
00386 const QString &Function,
00387 const QDateTime &FromTime,
00388 const QDateTime &ToTime,
00389 const QString &Level,
00390 const QString &MsgContains )
00391 {
00392 DTC::LogMessageList *pList = new DTC::LogMessageList();
00393
00394 MSqlQuery query(MSqlQuery::InitCon());
00395
00396
00397 QString sql = "SELECT DISTINCT host FROM logging ORDER BY host ASC";
00398 if (!query.exec(sql))
00399 {
00400 MythDB::DBError("Retrieving log host names", query);
00401 throw( QString( "Database Error executing query." ));
00402 }
00403 while (query.next())
00404 {
00405 DTC::LabelValue *pLabelValue = pList->AddNewHostName();
00406 QString availableHostName = query.value(0).toString();
00407 pLabelValue->setValue ( availableHostName );
00408 pLabelValue->setActive ( availableHostName == HostName );
00409 pLabelValue->setSelected( availableHostName == HostName );
00410 }
00411
00412 sql = "SELECT DISTINCT application FROM logging ORDER BY application ASC";
00413 if (!query.exec(sql))
00414 {
00415 MythDB::DBError("Retrieving log applications", query);
00416 throw( QString( "Database Error executing query." ));
00417 }
00418 while (query.next())
00419 {
00420 DTC::LabelValue *pLabelValue = pList->AddNewApplication();
00421 QString availableApplication = query.value(0).toString();
00422 pLabelValue->setValue ( availableApplication );
00423 pLabelValue->setActive ( availableApplication == Application );
00424 pLabelValue->setSelected( availableApplication == Application );
00425 }
00426
00427 if (!HostName.isEmpty() && !Application.isEmpty())
00428 {
00429
00430 sql = "SELECT host, application, pid, tid, thread, filename, "
00431 " line, function, msgtime, level, message "
00432 " FROM logging "
00433 " WHERE host = COALESCE(:HOSTNAME, host) "
00434 " AND application = COALESCE(:APPLICATION, application) "
00435 " AND pid = COALESCE(:PID, pid) "
00436 " AND tid = COALESCE(:TID, tid) "
00437 " AND thread = COALESCE(:THREAD, thread) "
00438 " AND filename = COALESCE(:FILENAME, filename) "
00439 " AND line = COALESCE(:LINE, line) "
00440 " AND function = COALESCE(:FUNCTION, function) "
00441 " AND msgtime >= COALESCE(:FROMTIME, msgtime) "
00442 " AND msgtime <= COALESCE(:TOTIME, msgtime) "
00443 " AND level <= COALESCE(:LEVEL, level) "
00444 ;
00445 if (!MsgContains.isEmpty())
00446 {
00447 sql.append(" AND message LIKE :MSGCONTAINS ");
00448 }
00449 sql.append(" ORDER BY msgtime ASC;");
00450
00451 query.prepare(sql);
00452
00453 query.bindValue(":HOSTNAME", (HostName.isEmpty()) ? QString() : HostName);
00454 query.bindValue(":APPLICATION", (Application.isEmpty()) ? QString() :
00455 Application);
00456 query.bindValue(":PID", ( PID == 0 ) ? QVariant(QVariant::ULongLong) :
00457 (qint64)PID);
00458 query.bindValue(":TID", ( TID == 0 ) ? QVariant(QVariant::ULongLong) :
00459 (qint64)TID);
00460 query.bindValue(":THREAD", (Thread.isEmpty()) ? QString() : Thread);
00461 query.bindValue(":FILENAME", (Filename.isEmpty()) ? QString() : Filename);
00462 query.bindValue(":LINE", ( Line == 0 ) ? QVariant(QVariant::ULongLong) :
00463 (qint64)Line);
00464 query.bindValue(":FUNCTION", (Function.isEmpty()) ? QString() : Function);
00465 query.bindValue(":FROMTIME", (FromTime.isValid()) ? FromTime : QDateTime());
00466 query.bindValue(":TOTIME", (ToTime.isValid()) ? ToTime : QDateTime());
00467 query.bindValue(":LEVEL", (Level.isEmpty()) ?
00468 QVariant(QVariant::ULongLong) :
00469 (qint64)logLevelGet(Level));
00470
00471 if (!MsgContains.isEmpty())
00472 {
00473 query.bindValue(":MSGCONTAINS", "%" + MsgContains + "%" );
00474 }
00475
00476 if (!query.exec())
00477 {
00478 MythDB::DBError("Retrieving log messages", query);
00479 throw( QString( "Database Error executing query." ));
00480 }
00481
00482 while (query.next())
00483 {
00484 DTC::LogMessage *pLogMessage = pList->AddNewLogMessage();
00485
00486 pLogMessage->setHostName( query.value(0).toString() );
00487 pLogMessage->setApplication( query.value(1).toString() );
00488 pLogMessage->setPID( query.value(2).toInt() );
00489 pLogMessage->setTID( query.value(3).toInt() );
00490 pLogMessage->setThread( query.value(4).toString() );
00491 pLogMessage->setFilename( query.value(5).toString() );
00492 pLogMessage->setLine( query.value(6).toInt() );
00493 pLogMessage->setFunction( query.value(7).toString() );
00494 pLogMessage->setTime( query.value(8).toDateTime() );
00495 pLogMessage->setLevel( logLevelGetName(
00496 (LogLevel_t)query.value(9).toInt()) );
00497 pLogMessage->setMessage( query.value(10).toString() );
00498 }
00499 }
00500
00501 return pList;
00502 }
00503
00505
00507
00508 DTC::SettingList *Myth::GetSetting( const QString &sHostName,
00509 const QString &sKey,
00510 const QString &sDefault )
00511 {
00512
00513 MSqlQuery query(MSqlQuery::InitCon());
00514
00515 if (!query.isConnected())
00516 {
00517 throw( QString("Database not open while trying to load setting: %1")
00518 .arg( sKey ));
00519 }
00520
00521
00522
00523 DTC::SettingList *pList = new DTC::SettingList();
00524
00525
00526 pList->setHostName ( sHostName );
00527
00528
00529
00530
00531
00532 if (!sKey.isEmpty())
00533 {
00534
00535
00536
00537
00538 query.prepare("SELECT data, hostname from settings "
00539 "WHERE value = :KEY AND "
00540 "(hostname = :HOSTNAME OR hostname IS NULL) "
00541 "ORDER BY hostname DESC;" );
00542
00543 query.bindValue(":KEY" , sKey );
00544 query.bindValue(":HOSTNAME", sHostName );
00545
00546 if (!query.exec())
00547 {
00548
00549
00550 delete pList;
00551
00552 MythDB::DBError("MythAPI::GetSetting() w/key ", query);
00553
00554 throw( QString( "Database Error executing query." ));
00555 }
00556
00557 if (query.next())
00558 {
00559 if ( (sHostName.isEmpty()) ||
00560 ((!sHostName.isEmpty()) &&
00561 (sHostName == query.value(1).toString())))
00562 {
00563 pList->setHostName( query.value(1).toString() );
00564
00565 pList->Settings().insert( sKey, query.value(0) );
00566 }
00567 }
00568 }
00569 else
00570 {
00571
00572
00573
00574
00575 if (sHostName.isEmpty())
00576 {
00577 query.prepare("SELECT value, data FROM settings "
00578 "WHERE (hostname IS NULL)" );
00579 }
00580 else
00581 {
00582 query.prepare("SELECT value, data FROM settings "
00583 "WHERE (hostname = :HOSTNAME)" );
00584
00585 query.bindValue(":HOSTNAME", sHostName );
00586 }
00587
00588 if (!query.exec())
00589 {
00590
00591
00592 delete pList;
00593
00594 MythDB::DBError("MythAPI::GetSetting() w/o key ", query);
00595 throw( QString( "Database Error executing query." ));
00596 }
00597
00598 while (query.next())
00599 pList->Settings().insert( query.value(0).toString(), query.value(1) );
00600 }
00601
00602
00603
00604
00605
00606 if (pList->Settings().count() == 0)
00607 pList->Settings().insert( sKey, sDefault );
00608
00609 return pList;
00610 }
00611
00613
00615
00616 bool Myth::PutSetting( const QString &sHostName,
00617 const QString &sKey,
00618 const QString &sValue )
00619 {
00620 bool bResult = false;
00621
00622 if (!sKey.isEmpty())
00623 {
00624 if ( gCoreContext->SaveSettingOnHost( sKey, sValue, sHostName ) )
00625 bResult = true;
00626
00627 return bResult;
00628 }
00629
00630 throw ( QString( "Key Required" ));
00631 }
00632
00634
00636
00637 bool Myth::ChangePassword( const QString &sUserName,
00638 const QString &sOldPassword,
00639 const QString &sNewPassword )
00640 {
00641 bool bResult = false;
00642
00643 if (sUserName.isEmpty())
00644 {
00645 throw ( QString( "UserName not supplied when trying to change "
00646 "password." ) );
00647 }
00648
00649 if (sOldPassword.isEmpty())
00650 {
00651 throw ( QString( "Old Password not supplied when trying to change "
00652 "password for '%1'." ).arg(sUserName) );
00653 }
00654
00655 if (sNewPassword.isEmpty())
00656 {
00657 throw ( QString( "New Password not supplied when trying to change "
00658 "password for '%1'." ).arg(sUserName) );
00659 }
00660
00661 QCryptographicHash crypto( QCryptographicHash::Sha1 );
00662
00663 crypto.addData( sOldPassword.toUtf8() );
00664
00665 QString sPasswordHash( crypto.result().toBase64() );
00666
00667 if ( sPasswordHash != gCoreContext->GetSetting( "HTTP/Protected/Password", ""))
00668 {
00669 throw ( QString( "Incorrect Old Password supplied when trying to "
00670 "change password for '%1'." ).arg(sUserName) );
00671 }
00672
00673 crypto.reset();
00674 crypto.addData( sNewPassword.toUtf8() );
00675
00676 if (gCoreContext->SaveSettingOnHost( "HTTP/Protected/Password", crypto.result().toBase64(),
00677 QString() ) )
00678 {
00679 gCoreContext->ClearSettingsCache();
00680 bResult = true;
00681 }
00682
00683 return bResult;
00684 }
00685
00687
00689
00690 bool Myth::TestDBSettings( const QString &sHostName,
00691 const QString &sUserName,
00692 const QString &sPassword,
00693 const QString &sDBName,
00694 int dbPort)
00695 {
00696 bool bResult = false;
00697
00698 QString db("mythconverg");
00699 int port = 3306;
00700
00701 if (!sDBName.isEmpty())
00702 db = sDBName;
00703
00704 if (dbPort != 0)
00705 port = dbPort;
00706
00707 bResult = TestDatabase(sHostName, sUserName, sPassword, db, port);
00708
00709 return bResult;
00710 }
00711
00713
00715
00716 bool Myth::SendMessage( const QString &sMessage,
00717 const QString &sAddress,
00718 int udpPort,
00719 int Timeout)
00720 {
00721 bool bResult = false;
00722
00723 if (sMessage.isEmpty())
00724 return bResult;
00725
00726 if (Timeout < 0 || Timeout > 999)
00727 Timeout = 0;
00728
00729 QString xmlMessage =
00730 "<mythmessage version=\"1\">\n"
00731 " <text>" + sMessage + "</text>\n"
00732 " <timeout>" + QString::number(Timeout) + "</timeout>\n"
00733 "</mythmessage>";
00734
00735 QHostAddress address = QHostAddress::Broadcast;
00736 unsigned short port = 6948;
00737
00738 if (!sAddress.isEmpty())
00739 address.setAddress(sAddress);
00740
00741 if (udpPort != 0)
00742 port = udpPort;
00743
00744 QUdpSocket *sock = new QUdpSocket();
00745 QByteArray utf8 = xmlMessage.toUtf8();
00746 int size = utf8.length();
00747
00748 if (sock->writeDatagram(utf8.constData(), size, address, port) < 0)
00749 {
00750 LOG(VB_GENERAL, LOG_ERR,
00751 QString("Failed to send UDP/XML packet (Message: %1 "
00752 "Address: %2 Port: %3")
00753 .arg(sMessage).arg(sAddress).arg(port));
00754 }
00755 else
00756 {
00757 LOG(VB_GENERAL, LOG_DEBUG,
00758 QString("UDP/XML packet sent! (Message: %1 Address: %2 Port: %3")
00759 .arg(sMessage)
00760 .arg(address.toString().toLocal8Bit().constData()).arg(port));
00761 bResult = true;
00762 }
00763
00764 sock->deleteLater();
00765
00766 return bResult;
00767 }
00768
00770
00772
00773 bool Myth::BackupDatabase(void)
00774 {
00775 bool bResult = false;
00776
00777 DBUtil *dbutil = new DBUtil();
00778 MythDBBackupStatus status = kDB_Backup_Unknown;
00779 QString filename;
00780
00781 LOG(VB_GENERAL, LOG_NOTICE, "Performing API invoked DB Backup.");
00782
00783 if (dbutil)
00784 status = dbutil->BackupDB(filename);
00785
00786 if (status == kDB_Backup_Completed)
00787 {
00788 LOG(VB_GENERAL, LOG_NOTICE, "Database backup succeeded.");
00789 bResult = true;
00790 }
00791 else
00792 LOG(VB_GENERAL, LOG_ERR, "Database backup failed.");
00793
00794 delete dbutil;
00795
00796 return bResult;
00797 }
00798
00800
00802
00803 bool Myth::CheckDatabase( bool repair )
00804 {
00805 bool bResult = false;
00806
00807 DBUtil *dbutil = new DBUtil();
00808
00809 LOG(VB_GENERAL, LOG_NOTICE, "Performing API invoked DB Check.");
00810
00811 if (dbutil)
00812 bResult = dbutil->CheckTables(repair);
00813
00814 if (bResult)
00815 LOG(VB_GENERAL, LOG_NOTICE, "Database check complete.");
00816 else
00817 LOG(VB_GENERAL, LOG_ERR, "Database check failed.");
00818
00819 delete dbutil;
00820
00821 return bResult;
00822 }
00823
00825
00827
00828 bool Myth::ProfileSubmit()
00829 {
00830 bool bResult = false;
00831
00832 HardwareProfile *profile = new HardwareProfile();
00833 if (profile)
00834 {
00835 LOG(VB_GENERAL, LOG_NOTICE, "Profile Submission...");
00836 profile->GenerateUUIDs();
00837 bResult = profile->SubmitProfile();
00838 if (bResult)
00839 LOG(VB_GENERAL, LOG_NOTICE, "Profile Submitted.");
00840 }
00841 delete profile;
00842
00843 return bResult;
00844 }
00845
00847
00849
00850 bool Myth::ProfileDelete()
00851 {
00852 bool bResult = false;
00853
00854 HardwareProfile *profile = new HardwareProfile();
00855 if (profile)
00856 {
00857 LOG(VB_GENERAL, LOG_NOTICE, "Profile Deletion...");
00858 profile->GenerateUUIDs();
00859 bResult = profile->DeleteProfile();
00860 if (bResult)
00861 LOG(VB_GENERAL, LOG_NOTICE, "Profile Deleted.");
00862 }
00863 delete profile;
00864
00865 return bResult;
00866 }
00867
00869
00871
00872 QString Myth::ProfileURL()
00873 {
00874 QString sProfileURL;
00875
00876 HardwareProfile *profile = new HardwareProfile();
00877 if (profile)
00878 {
00879 profile->GenerateUUIDs();
00880 sProfileURL = profile->GetProfileURL();
00881 LOG(VB_GENERAL, LOG_NOTICE, QString("ProfileURL: %1").arg(sProfileURL));
00882 }
00883 delete profile;
00884
00885 return sProfileURL;
00886 }
00887
00889
00891
00892 QString Myth::ProfileUpdated()
00893 {
00894 QString sProfileUpdate;
00895
00896 HardwareProfile *profile = new HardwareProfile();
00897 if (profile)
00898 {
00899 profile->GenerateUUIDs();
00900 QDateTime tUpdated;
00901 tUpdated = profile->GetLastUpdate();
00902 sProfileUpdate = tUpdated.toString(
00903 gCoreContext->GetSetting( "DateFormat", "MM.dd.yyyy"));
00904 }
00905 delete profile;
00906
00907 return sProfileUpdate;
00908 }
00909
00911
00913
00914 QString Myth::ProfileText()
00915 {
00916 QString sProfileText;
00917
00918 HardwareProfile *profile = new HardwareProfile();
00919 if (profile)
00920 sProfileText = profile->GetHardwareProfile();
00921 delete profile;
00922
00923 return sProfileText;
00924 }
00925