- Timestamp:
- Jun 6, 2017 4:39:59 PM (8 years ago)
- Location:
- trunk/src/VBox/Frontends/VirtualBox/src
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp
r67217 r67277 966 966 } 967 967 968 QString VBoxGlobal::detailsReport(const CMachine &comMachine, bool fWithLinks)969 {970 /* Details templates: */971 static const char *sTableTpl =972 "<table border=0 cellspacing=1 cellpadding=0>%1</table>";973 static const char *sSectionHrefTpl =974 "<tr><td width=%6 rowspan=%1 align=left><img src='%2'></td>"975 "<td colspan=3><b><a href='%3'><nobr>%4</nobr></a></b></td></tr>"976 "%5"977 "<tr><td colspan=3><font size=1> </font></td></tr>";978 static const char *sSectionBoldTpl =979 "<tr><td width=%6 rowspan=%1 align=left><img src='%2'></td>"980 "<td colspan=3><!-- %3 --><b><nobr>%4</nobr></b></td></tr>"981 "%5"982 "<tr><td colspan=3><font size=1> </font></td></tr>";983 static const char *sSectionItemTpl1 =984 "<tr><td width=40%><nobr><i>%1</i></nobr></td><td/><td/></tr>";985 static const char *sSectionItemTpl2 =986 "<tr><td width=40%><nobr>%1:</nobr></td><td/><td>%2</td></tr>";987 static const char *sSectionItemTpl3 =988 "<tr><td width=40%><nobr>%1</nobr></td><td/><td/></tr>";989 990 /* Do we want the links? */991 const QString &strSectionTpl = fWithLinks ? sSectionHrefTpl : sSectionBoldTpl;992 993 /* Determine icon metric: */994 const QStyle *pStyle = QApplication::style();995 const int iIconMetric = pStyle->pixelMetric(QStyle::PM_SmallIconSize);996 const int iIndentMetric = iIconMetric * 1.375;997 998 /* Compose details report: */999 QString strReport;1000 1001 /* General: */1002 {1003 /* Name, OS Type: */1004 int iRowCount = 2;1005 QString strItem = QString(sSectionItemTpl2).arg(tr("Name", "details report"),1006 comMachine.GetName())1007 + QString(sSectionItemTpl2).arg(tr("OS Type", "details report"),1008 vmGuestOSTypeDescription(comMachine.GetOSTypeId()));1009 1010 /* Group(s)? */1011 const QStringList &groups = comMachine.GetGroups().toList();1012 if ( groups.size() > 11013 || (groups.size() > 0 && groups.at(0) != "/"))1014 {1015 ++iRowCount;1016 strItem += QString(sSectionItemTpl2).arg(tr("Group(s)", "details report"),1017 groups.join(", "));1018 }1019 1020 /* Append report: */1021 strReport += strSectionTpl1022 .arg(2 + iRowCount) /* rows */1023 .arg("details://general", /* icon */1024 "#general", /* link */1025 tr("General", "details report"), /* title */1026 strItem, /* items */1027 QString::number(iIndentMetric));1028 }1029 1030 /* System: */1031 {1032 /* Base Memory, Processor(s): */1033 int iRowCount = 2;1034 QString strItem = QString(sSectionItemTpl2).arg(tr("Base Memory", "details report"),1035 tr("<nobr>%1 MB</nobr>", "details report")1036 .arg(QString::number(comMachine.GetMemorySize())))1037 + QString(sSectionItemTpl2).arg(tr("Processor(s)", "details report"),1038 tr("<nobr>%1</nobr>", "details report")1039 .arg(QString::number(comMachine.GetCPUCount())));1040 1041 /* Execution Cap? */1042 ULONG uExecutionCap = comMachine.GetCPUExecutionCap();1043 if (uExecutionCap < 100)1044 {1045 ++iRowCount;1046 strItem += QString(sSectionItemTpl2).arg(tr("Execution Cap", "details report"),1047 tr("<nobr>%1%</nobr>", "details report")1048 .arg(comMachine.GetCPUExecutionCap()));1049 }1050 1051 /* Boot Order: */1052 ++iRowCount;1053 QStringList bootOrder;1054 for (ulong i = 1; i <= m_vbox.GetSystemProperties().GetMaxBootPosition(); ++i)1055 {1056 const KDeviceType enmDevice = comMachine.GetBootOrder(i);1057 if (enmDevice != KDeviceType_Null)1058 bootOrder << gpConverter->toString(enmDevice);1059 }1060 if (bootOrder.isEmpty())1061 bootOrder << gpConverter->toString(KDeviceType_Null);1062 strItem += QString(sSectionItemTpl2).arg(tr("Boot Order", "details report"),1063 bootOrder.join(", "));1064 1065 #ifdef VBOX_WITH_FULL_DETAILS_REPORT1066 1067 /* Acquire BIOS Settings: */1068 const CBIOSSettings &comBiosSettings = comMachine.GetBIOSSettings();1069 1070 /* ACPI: */1071 ++iRowCount;1072 const QString strAcpi = comBiosSettings.GetACPIEnabled()1073 ? tr("Enabled", "details report (ACPI)")1074 : tr("Disabled", "details report (ACPI)");1075 strItem += QString(sSectionItemTpl2).arg(tr("ACPI", "details report"), strAcpi);1076 1077 /* I/O APIC: */1078 ++iRowCount;1079 const QString strIoapic = comBiosSettings.GetIOAPICEnabled()1080 ? tr("Enabled", "details report (I/O APIC)")1081 : tr("Disabled", "details report (I/O APIC)");1082 strItem += QString(sSectionItemTpl2).arg(tr("I/O APIC", "details report"), strIoapic);1083 1084 /* PAE/NX: */1085 ++iRowCount;1086 const QString strPae = comMachine.GetCPUProperty(KCPUPropertyType_PAE)1087 ? tr("Enabled", "details report (PAE/NX)")1088 : tr("Disabled", "details report (PAE/NX)");1089 strItem += QString(sSectionItemTpl2).arg(tr("PAE/NX", "details report"), strPae);1090 1091 #endif /* VBOX_WITH_FULL_DETAILS_REPORT */1092 1093 /* VT-x/AMD-V availability: */1094 const bool fVTxAMDVSupported = host().GetProcessorFeature(KProcessorFeature_HWVirtEx);1095 if (fVTxAMDVSupported)1096 {1097 /* VT-x/AMD-V: */1098 ++iRowCount;1099 const QString strVirt = comMachine.GetHWVirtExProperty(KHWVirtExPropertyType_Enabled)1100 ? tr("Enabled", "details report (VT-x/AMD-V)")1101 : tr("Disabled", "details report (VT-x/AMD-V)");1102 strItem += QString(sSectionItemTpl2).arg(tr("VT-x/AMD-V", "details report"), strVirt);1103 1104 /* Nested Paging: */1105 ++iRowCount;1106 const QString strNested = comMachine.GetHWVirtExProperty(KHWVirtExPropertyType_NestedPaging)1107 ? tr("Enabled", "details report (Nested Paging)")1108 : tr("Disabled", "details report (Nested Paging)");1109 strItem += QString(sSectionItemTpl2).arg(tr("Nested Paging", "details report"), strNested);1110 }1111 1112 /* Paravirtualization Interface: */1113 ++iRowCount;1114 const QString strParavirtProvider = gpConverter->toString(comMachine.GetParavirtProvider());1115 strItem += QString(sSectionItemTpl2).arg(tr("Paravirtualization Interface", "details report"), strParavirtProvider);1116 1117 /* Append report: */1118 strReport += strSectionTpl1119 .arg(2 + iRowCount) /* rows */1120 .arg("details://system", /* icon */1121 "#system", /* link */1122 tr("System", "details report"), /* title */1123 strItem, /* items */1124 QString::number(iIndentMetric));1125 }1126 1127 /* Display: */1128 {1129 /* Video Memory: */1130 int iRowCount = 1;1131 QString strItem = QString(sSectionItemTpl2).arg(tr("Video Memory", "details report"),1132 tr("<nobr>%1 MB</nobr>", "details report")1133 .arg(QString::number(comMachine.GetVRAMSize())));1134 1135 /* Screens? */1136 const int cGuestScreens = comMachine.GetMonitorCount();1137 if (cGuestScreens > 1)1138 {1139 ++iRowCount;1140 strItem += QString(sSectionItemTpl2).arg(tr("Screens", "details report"),1141 QString::number(cGuestScreens));1142 }1143 1144 /* 3D Acceleration: */1145 ++iRowCount;1146 QString strAcc3d = comMachine.GetAccelerate3DEnabled() && is3DAvailable()1147 ? tr("Enabled", "details report (3D Acceleration)")1148 : tr("Disabled", "details report (3D Acceleration)");1149 strItem += QString(sSectionItemTpl2).arg(tr("3D Acceleration", "details report"), strAcc3d);1150 1151 #ifdef VBOX_WITH_VIDEOHWACCEL1152 /* 2D Video Acceleration: */1153 ++iRowCount;1154 QString strAcc2dVideo = comMachine.GetAccelerate2DVideoEnabled()1155 ? tr("Enabled", "details report (2D Video Acceleration)")1156 : tr("Disabled", "details report (2D Video Acceleration)");1157 strItem += QString(sSectionItemTpl2).arg(tr("2D Video Acceleration", "details report"), strAcc2dVideo);1158 #endif1159 1160 /* Remote Desktop Server: */1161 const CVRDEServer comServer = comMachine.GetVRDEServer();1162 if (!comServer.isNull())1163 {1164 ++iRowCount;1165 if (comServer.GetEnabled())1166 strItem += QString(sSectionItemTpl2).arg(tr("Remote Desktop Server Port", "details report (VRDE Server)"),1167 comServer.GetVRDEProperty("TCP/Ports"));1168 else1169 strItem += QString(sSectionItemTpl2).arg(tr("Remote Desktop Server", "details report (VRDE Server)"),1170 tr("Disabled", "details report (VRDE Server)"));1171 }1172 1173 /* Append report: */1174 strReport += strSectionTpl1175 .arg(2 + iRowCount) /* rows */1176 .arg("details://display", /* icon */1177 "#display", /* link */1178 tr("Display", "details report"), /* title */1179 strItem, /* items */1180 QString::number(iIndentMetric));1181 }1182 1183 /* Storage: */1184 {1185 /* Nothing: */1186 int iRowCount = 0;1187 QString strItem;1188 1189 /* Iterate over the all machine controllers: */1190 foreach (const CStorageController &comController, comMachine.GetStorageControllers())1191 {1192 /* Add controller information: */1193 ++iRowCount;1194 const QString strControllerName = QApplication::translate("UIMachineSettingsStorage", "Controller: %1");1195 strItem += QString(sSectionItemTpl3).arg(strControllerName.arg(comController.GetName()));1196 1197 /* Populate sorted map with attachments information: */1198 QMap<StorageSlot,QString> attachmentsMap;1199 foreach (const CMediumAttachment &comAttachment, comMachine.GetMediumAttachmentsOfController(comController.GetName()))1200 {1201 /* Prepare current storage slot: */1202 const StorageSlot attachmentSlot(comController.GetBus(), comAttachment.GetPort(), comAttachment.GetDevice());1203 // TODO: Fix that NLS bug one day..1204 /* Append 'device slot name' with 'device type name' for optical devices only: */1205 QString strDeviceType = comAttachment.GetType() == KDeviceType_DVD ? tr("(Optical Drive)") : QString();1206 if (!strDeviceType.isNull())1207 strDeviceType.prepend(' ');1208 /* Prepare current medium object: */1209 const CMedium &medium = comAttachment.GetMedium();1210 /* Prepare information about current medium & attachment: */1211 QString strAttachmentInfo = !comAttachment.isOk()1212 ? QString()1213 : QString(sSectionItemTpl2)1214 .arg(QString(" ") +1215 gpConverter->toString(StorageSlot(comController.GetBus(),1216 comAttachment.GetPort(),1217 comAttachment.GetDevice())) + strDeviceType)1218 .arg(details(medium, false));1219 /* Insert that attachment into map: */1220 if (!strAttachmentInfo.isNull())1221 attachmentsMap.insert(attachmentSlot, strAttachmentInfo);1222 }1223 1224 /* Iterate over the sorted map with attachments information: */1225 QMapIterator<StorageSlot, QString> it(attachmentsMap);1226 while (it.hasNext())1227 {1228 /* Add controller information: */1229 it.next();1230 ++iRowCount;1231 strItem += it.value();1232 }1233 }1234 1235 /* Handle side-case: */1236 if (strItem.isNull())1237 {1238 ++iRowCount;1239 strItem = QString(sSectionItemTpl1).arg(tr("Not Attached", "details report (Storage)"));1240 }1241 1242 /* Append report: */1243 strReport += strSectionTpl1244 .arg(2 + iRowCount) /* rows */1245 .arg("details://storage", /* icon */1246 "#storage", /* link */1247 tr("Storage", "details report"), /* title */1248 strItem, /* items */1249 QString::number(iIndentMetric));1250 }1251 1252 /* Audio: */1253 {1254 /* Nothing: */1255 int iRowCount = 0;1256 QString strItem;1257 1258 /* Host Driver, Controller? */1259 const CAudioAdapter &comAudio = comMachine.GetAudioAdapter();1260 if (comAudio.GetEnabled())1261 {1262 iRowCount += 2;1263 strItem = QString(sSectionItemTpl2).arg(tr("Host Driver", "details report (audio)"),1264 gpConverter->toString(comAudio.GetAudioDriver()))1265 + QString(sSectionItemTpl2).arg(tr("Controller", "details report (audio)"),1266 gpConverter->toString(comAudio.GetAudioController()));1267 }1268 else1269 {1270 ++iRowCount;1271 strItem = QString(sSectionItemTpl1).arg(tr("Disabled", "details report (audio)"));1272 }1273 1274 /* Append report: */1275 strReport += strSectionTpl1276 .arg(2 + iRowCount) /* rows */1277 .arg("details://audio", /* icon */1278 "#audio", /* link */1279 tr("Audio", "details report"), /* title */1280 strItem, /* items */1281 QString::number(iIndentMetric));1282 }1283 1284 /* Network: */1285 {1286 /* Nothing: */1287 int iRowCount = 0;1288 QString strItem;1289 1290 /* Enumerate all the network adapters (up to acquired/limited count): */1291 const ulong iCount = m_vbox.GetSystemProperties().GetMaxNetworkAdapters(comMachine.GetChipsetType());1292 for (ulong iSlot = 0; iSlot < iCount; ++iSlot)1293 {1294 /* Get current network adapter: */1295 const CNetworkAdapter &comNetwork = comMachine.GetNetworkAdapter(iSlot);1296 if (comNetwork.GetEnabled())1297 {1298 /* Determine attachment type: */1299 const KNetworkAttachmentType enmType = comNetwork.GetAttachmentType();1300 QString attType = gpConverter->toString(comNetwork.GetAdapterType())1301 .replace(QRegExp("\\s\\(.+\\)"), " (%1)");1302 /* Don't use the adapter type string for types that have1303 * an additional symbolic network/interface name field,1304 * use this name instead: */1305 switch (enmType)1306 {1307 case KNetworkAttachmentType_Bridged:1308 attType = attType.arg(tr("Bridged adapter, %1", "details report (network)")1309 .arg(comNetwork.GetBridgedInterface()));1310 break;1311 case KNetworkAttachmentType_Internal:1312 attType = attType.arg(tr("Internal network, '%1'", "details report (network)")1313 .arg(comNetwork.GetInternalNetwork()));1314 break;1315 case KNetworkAttachmentType_HostOnly:1316 attType = attType.arg(tr("Host-only adapter, '%1'", "details report (network)")1317 .arg(comNetwork.GetHostOnlyInterface()));1318 break;1319 case KNetworkAttachmentType_Generic:1320 attType = attType.arg(tr("Generic, '%1'", "details report (network)")1321 .arg(comNetwork.GetGenericDriver()));1322 break;1323 case KNetworkAttachmentType_NATNetwork:1324 attType = attType.arg(tr("NAT network, '%1'", "details report (network)")1325 .arg(comNetwork.GetNATNetwork()));1326 break;1327 default:1328 attType = attType.arg(gpConverter->toString(enmType));1329 break;1330 }1331 /* Here goes the record: */1332 ++iRowCount;1333 strItem += QString(sSectionItemTpl2).arg(tr("Adapter %1", "details report (network)")1334 .arg(comNetwork.GetSlot() + 1),1335 attType);1336 }1337 }1338 1339 /* Handle side-case: */1340 if (strItem.isNull())1341 {1342 ++iRowCount;1343 strItem = QString(sSectionItemTpl1).arg(tr("Disabled", "details report (network)"));1344 }1345 1346 /* Append report: */1347 strReport += strSectionTpl1348 .arg(2 + iRowCount) /* rows */1349 .arg("details://network", /* icon */1350 "#network", /* link */1351 tr("Network", "details report"), /* title */1352 strItem, /* items */1353 QString::number(iIndentMetric));1354 }1355 1356 /* Serial Ports: */1357 {1358 /* Nothing: */1359 int iRowCount = 0;1360 QString strItem;1361 1362 /* Enumerate all the serial ports (up to acquired/limited count): */1363 const ulong iCount = m_vbox.GetSystemProperties().GetSerialPortCount();1364 for (ulong iSlot = 0; iSlot < iCount; ++iSlot)1365 {1366 /* Get current serial port: */1367 const CSerialPort &comSerial = comMachine.GetSerialPort(iSlot);1368 if (comSerial.GetEnabled())1369 {1370 /* Determine port mode: */1371 const KPortMode enmMode = comSerial.GetHostMode();1372 /* Compose the data: */1373 QString strData = toCOMPortName(comSerial.GetIRQ(), comSerial.GetIOBase()) + ", ";1374 if ( enmMode == KPortMode_HostPipe1375 || enmMode == KPortMode_HostDevice1376 || enmMode == KPortMode_TCP1377 || enmMode == KPortMode_RawFile)1378 strData += QString("%1 (<nobr>%2</nobr>)").arg(gpConverter->toString(enmMode))1379 .arg(QDir::toNativeSeparators(comSerial.GetPath()));1380 else1381 strData += gpConverter->toString(enmMode);1382 /* Here goes the record: */1383 ++iRowCount;1384 strItem += QString(sSectionItemTpl2).arg(tr("Port %1", "details report (serial ports)")1385 .arg(comSerial.GetSlot() + 1),1386 strData);1387 }1388 }1389 1390 /* Handle side-case: */1391 if (strItem.isNull())1392 {1393 ++iRowCount;1394 strItem = QString(sSectionItemTpl1).arg(tr("Disabled", "details report (serial ports)"));1395 }1396 1397 /* Append report: */1398 strReport += strSectionTpl1399 .arg(2 + iRowCount) /* rows */1400 .arg("details://serialPorts", /* icon */1401 "#serialPorts", /* link */1402 tr("Serial Ports", "details report"), /* title */1403 strItem, /* items */1404 QString::number(iIndentMetric));1405 }1406 1407 /* Parallel Ports: */1408 {1409 /* Nothing: */1410 int iRowCount = 0;1411 QString strItem;1412 1413 /* Enumerate all the serial ports (up to acquired/limited count): */1414 const ulong iCount = m_vbox.GetSystemProperties().GetParallelPortCount();1415 for (ulong iSlot = 0; iSlot < iCount; ++iSlot)1416 {1417 /* Get current parallel port: */1418 const CParallelPort &comParallel = comMachine.GetParallelPort(iSlot);1419 if (comParallel.GetEnabled())1420 {1421 /* Compose the data: */1422 QString strData = toLPTPortName(comParallel.GetIRQ(), comParallel.GetIOBase())1423 + QString(" (<nobr>%1</nobr>)").arg(QDir::toNativeSeparators(comParallel.GetPath()));1424 /* Here goes the record: */1425 ++iRowCount;1426 strItem += QString(sSectionItemTpl2).arg(tr("Port %1", "details report (parallel ports)")1427 .arg(comParallel.GetSlot() + 1),1428 strData);1429 }1430 }1431 1432 /* Handle side-case: */1433 if (strItem.isNull())1434 {1435 ++iRowCount;1436 strItem = QString(sSectionItemTpl1).arg(tr("Disabled", "details report (parallel ports)"));1437 }1438 1439 /* Temporary disabled: */1440 const QString dummy = strSectionTpl /* strReport += strSectionTpl */1441 .arg(2 + iRowCount) /* rows */1442 .arg("details://parallelPorts", /* icon */1443 "#parallelPorts", /* link */1444 tr("Parallel Ports", "details report"), /* title */1445 strItem, /* items */1446 QString::number(iIndentMetric));1447 Q_UNUSED(dummy);1448 }1449 1450 /* USB */1451 {1452 /* Acquire USB filters object: */1453 const CUSBDeviceFilters &comFilters = comMachine.GetUSBDeviceFilters();1454 if ( !comFilters.isNull()1455 && comMachine.GetUSBProxyAvailable())1456 {1457 /* Device Filters: */1458 int iRowCount = 1;1459 QString strItem;1460 1461 /* The USB controller may be unavailable (i.e. in VirtualBox OSE): */1462 if (!comMachine.GetUSBControllers().isEmpty())1463 {1464 /* Acquire USB filters: */1465 const CUSBDeviceFilterVector &filterVector = comFilters.GetDeviceFilters();1466 /* Calculate the amount of active filters: */1467 uint cActive = 0;1468 foreach (const CUSBDeviceFilter &comFilter, filterVector)1469 if (comFilter.GetActive())1470 ++cActive;1471 /* Here goes the record: */1472 strItem = QString(sSectionItemTpl2).arg(tr("Device Filters", "details report (USB)"),1473 tr("%1 (%2 active)", "details report (USB)")1474 .arg(filterVector.size()).arg(cActive));1475 }1476 1477 /* Handle side-case: */1478 if (strItem.isNull())1479 strItem = QString(sSectionItemTpl1).arg(tr("Disabled", "details report (USB)"));1480 1481 /* Append report: */1482 strReport += strSectionTpl1483 .arg(2 + iRowCount) /* rows */1484 .arg("details://usb", /* icon */1485 "#usb", /* link */1486 tr("USB", "details report"), /* title */1487 strItem, /* items */1488 QString::number(iIndentMetric));1489 }1490 }1491 1492 /* Shared Folders */1493 {1494 /* Shared Folders: */1495 int iRowCount = 1;1496 QString strItem;1497 1498 /* Acquire shared folders count: */1499 const ulong iCount = comMachine.GetSharedFolders().size();1500 if (iCount > 0)1501 strItem = QString(sSectionItemTpl2).arg(tr("Shared Folders", "details report (shared folders)"),1502 QString::number(iCount));1503 else1504 strItem = QString(sSectionItemTpl1).arg(tr("None", "details report (shared folders)"));1505 1506 /* Append report: */1507 strReport += strSectionTpl1508 .arg(2 + iRowCount) /* rows */1509 .arg("details://sharedFolders", /* icon */1510 "#sfolders", /* link */1511 tr("Shared Folders", "details report"), /* title */1512 strItem, /* items */1513 QString::number(iIndentMetric));1514 }1515 1516 /* Compose full report: */1517 return QString(sTableTpl).arg(strReport);1518 }1519 1520 968 CSession VBoxGlobal::openSession(const QString &strId, KLockType lockType /* = KLockType_Shared */) 1521 969 { -
trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h
r67212 r67277 310 310 QString toolTip (const CUSBDeviceFilter &aFilter) const; 311 311 QString toolTip(const CHostVideoInputDevice &webcam) const; 312 313 /** Returns a details report on a given VM represented as a HTML table.314 * @param comMachine Brings the machine object to create a report for.315 * @param fWithLinks Brings @c true if section titles should be hypertext links. */316 QString detailsReport(const CMachine &comMachine, bool fWithLinks);317 312 318 313 /* VirtualBox helpers */ -
trunk/src/VBox/Frontends/VirtualBox/src/selector/UISnapshotDetailsWidget.cpp
r67246 r67277 23 23 # include <QHBoxLayout> 24 24 # include <QDateTime> 25 # include <QDir> 25 26 # include <QGridLayout> 26 27 # include <QLabel> … … 44 45 45 46 /* COM includes: */ 47 # include "CAudioAdapter.h" 46 48 # include "CMachine.h" 49 # include "CMedium.h" 50 # include "CMediumAttachment.h" 51 # include "CNetworkAdapter.h" 52 # ifdef VBOX_WITH_PARALLEL_PORTS 53 # include "CParallelPort.h" 54 # endif 55 # include "CSerialPort.h" 56 # include "CSharedFolder.h" 57 # include "CStorageController.h" 58 # include "CSystemProperties.h" 59 # include "CUSBController.h" 60 # include "CUSBDeviceFilter.h" 61 # include "CUSBDeviceFilters.h" 62 # include "CVRDEServer.h" 47 63 48 64 #endif /* !VBOX_WITH_PRECOMPILED_HEADERS */ … … 382 398 383 399 /* Rebuild the details report: */ 384 m_pBrowserDetails->setText( vboxGlobal().detailsReport(comMachine, false /* with links? */));400 m_pBrowserDetails->setText(detailsReport(comMachine)); 385 401 } 386 402 else … … 626 642 #ifdef VBOX_WITH_PARALLEL_PORTS 627 643 << DetailsElementType_Parallel 628 #endif /* VBOX_WITH_PARALLEL_PORTS */644 #endif 629 645 << DetailsElementType_USB 630 646 << DetailsElementType_SF … … 753 769 } 754 770 771 QString UISnapshotDetailsWidget::detailsReport(const CMachine &comMachine) 772 { 773 /* Details templates: */ 774 static const char *sTableTpl = 775 "<table border=0 cellspacing=1 cellpadding=0>%1</table>"; 776 static const char *sSectionBoldTpl = 777 "<tr><td width=%6 rowspan=%1 align=left><img src='%2'></td>" 778 "<td colspan=3><!-- %3 --><b><nobr>%4</nobr></b></td></tr>" 779 "%5" 780 "<tr><td colspan=3><font size=1> </font></td></tr>"; 781 static const char *sSectionItemTpl1 = 782 "<tr><td width=40%><nobr><i>%1</i></nobr></td><td/><td/></tr>"; 783 static const char *sSectionItemTpl2 = 784 "<tr><td width=40%><nobr>%1:</nobr></td><td/><td>%2</td></tr>"; 785 static const char *sSectionItemTpl3 = 786 "<tr><td width=40%><nobr>%1</nobr></td><td/><td/></tr>"; 787 788 /* Use the const ref on the basis of implicit QString constructor: */ 789 const QString &strSectionTpl = sSectionBoldTpl; 790 791 /* Determine icon metric: */ 792 const QStyle *pStyle = QApplication::style(); 793 const int iIconMetric = pStyle->pixelMetric(QStyle::PM_SmallIconSize); 794 const int iIndentMetric = iIconMetric * 1.375; 795 796 /* Compose details report: */ 797 QString strReport; 798 799 /* General: */ 800 { 801 /* Name, OS Type: */ 802 int iRowCount = 2; 803 QString strItem = QString(sSectionItemTpl2).arg(tr("Name", "details report"), 804 comMachine.GetName()) 805 + QString(sSectionItemTpl2).arg(tr("OS Type", "details report"), 806 vboxGlobal().vmGuestOSTypeDescription(comMachine.GetOSTypeId())); 807 808 /* Group(s)? */ 809 const QStringList &groups = comMachine.GetGroups().toList(); 810 if ( groups.size() > 1 811 || (groups.size() > 0 && groups.at(0) != "/")) 812 { 813 ++iRowCount; 814 strItem += QString(sSectionItemTpl2).arg(tr("Group(s)", "details report"), 815 groups.join(", ")); 816 } 817 818 /* Append report: */ 819 strReport += strSectionTpl 820 .arg(2 + iRowCount) /* rows */ 821 .arg("details://general", /* icon */ 822 "#general", /* link */ 823 tr("General", "details report"), /* title */ 824 strItem, /* items */ 825 QString::number(iIndentMetric)); 826 } 827 828 /* System: */ 829 { 830 /* Base Memory, Processor(s): */ 831 int iRowCount = 2; 832 QString strItem = QString(sSectionItemTpl2).arg(tr("Base Memory", "details report"), 833 tr("<nobr>%1 MB</nobr>", "details report") 834 .arg(QString::number(comMachine.GetMemorySize()))) 835 + QString(sSectionItemTpl2).arg(tr("Processor(s)", "details report"), 836 tr("<nobr>%1</nobr>", "details report") 837 .arg(QString::number(comMachine.GetCPUCount()))); 838 839 /* Execution Cap? */ 840 ULONG uExecutionCap = comMachine.GetCPUExecutionCap(); 841 if (uExecutionCap < 100) 842 { 843 ++iRowCount; 844 strItem += QString(sSectionItemTpl2).arg(tr("Execution Cap", "details report"), 845 tr("<nobr>%1%</nobr>", "details report") 846 .arg(comMachine.GetCPUExecutionCap())); 847 } 848 849 /* Boot Order: */ 850 ++iRowCount; 851 QStringList bootOrder; 852 for (ulong i = 1; i <= vboxGlobal().virtualBox().GetSystemProperties().GetMaxBootPosition(); ++i) 853 { 854 const KDeviceType enmDevice = comMachine.GetBootOrder(i); 855 if (enmDevice != KDeviceType_Null) 856 bootOrder << gpConverter->toString(enmDevice); 857 } 858 if (bootOrder.isEmpty()) 859 bootOrder << gpConverter->toString(KDeviceType_Null); 860 strItem += QString(sSectionItemTpl2).arg(tr("Boot Order", "details report"), 861 bootOrder.join(", ")); 862 863 #ifdef VBOX_WITH_FULL_DETAILS_REPORT 864 865 /* Acquire BIOS Settings: */ 866 const CBIOSSettings &comBiosSettings = comMachine.GetBIOSSettings(); 867 868 /* ACPI: */ 869 ++iRowCount; 870 const QString strAcpi = comBiosSettings.GetACPIEnabled() 871 ? tr("Enabled", "details report (ACPI)") 872 : tr("Disabled", "details report (ACPI)"); 873 strItem += QString(sSectionItemTpl2).arg(tr("ACPI", "details report"), strAcpi); 874 875 /* I/O APIC: */ 876 ++iRowCount; 877 const QString strIoapic = comBiosSettings.GetIOAPICEnabled() 878 ? tr("Enabled", "details report (I/O APIC)") 879 : tr("Disabled", "details report (I/O APIC)"); 880 strItem += QString(sSectionItemTpl2).arg(tr("I/O APIC", "details report"), strIoapic); 881 882 /* PAE/NX: */ 883 ++iRowCount; 884 const QString strPae = comMachine.GetCPUProperty(KCPUPropertyType_PAE) 885 ? tr("Enabled", "details report (PAE/NX)") 886 : tr("Disabled", "details report (PAE/NX)"); 887 strItem += QString(sSectionItemTpl2).arg(tr("PAE/NX", "details report"), strPae); 888 889 #endif /* VBOX_WITH_FULL_DETAILS_REPORT */ 890 891 /* VT-x/AMD-V availability: */ 892 const bool fVTxAMDVSupported = vboxGlobal().host().GetProcessorFeature(KProcessorFeature_HWVirtEx); 893 if (fVTxAMDVSupported) 894 { 895 /* VT-x/AMD-V: */ 896 ++iRowCount; 897 const QString strVirt = comMachine.GetHWVirtExProperty(KHWVirtExPropertyType_Enabled) 898 ? tr("Enabled", "details report (VT-x/AMD-V)") 899 : tr("Disabled", "details report (VT-x/AMD-V)"); 900 strItem += QString(sSectionItemTpl2).arg(tr("VT-x/AMD-V", "details report"), strVirt); 901 902 /* Nested Paging: */ 903 ++iRowCount; 904 const QString strNested = comMachine.GetHWVirtExProperty(KHWVirtExPropertyType_NestedPaging) 905 ? tr("Enabled", "details report (Nested Paging)") 906 : tr("Disabled", "details report (Nested Paging)"); 907 strItem += QString(sSectionItemTpl2).arg(tr("Nested Paging", "details report"), strNested); 908 } 909 910 /* Paravirtualization Interface: */ 911 ++iRowCount; 912 const QString strParavirtProvider = gpConverter->toString(comMachine.GetParavirtProvider()); 913 strItem += QString(sSectionItemTpl2).arg(tr("Paravirtualization Interface", "details report"), strParavirtProvider); 914 915 /* Append report: */ 916 strReport += strSectionTpl 917 .arg(2 + iRowCount) /* rows */ 918 .arg("details://system", /* icon */ 919 "#system", /* link */ 920 tr("System", "details report"), /* title */ 921 strItem, /* items */ 922 QString::number(iIndentMetric)); 923 } 924 925 /* Display: */ 926 { 927 /* Video Memory: */ 928 int iRowCount = 1; 929 QString strItem = QString(sSectionItemTpl2).arg(tr("Video Memory", "details report"), 930 tr("<nobr>%1 MB</nobr>", "details report") 931 .arg(QString::number(comMachine.GetVRAMSize()))); 932 933 /* Screens? */ 934 const int cGuestScreens = comMachine.GetMonitorCount(); 935 if (cGuestScreens > 1) 936 { 937 ++iRowCount; 938 strItem += QString(sSectionItemTpl2).arg(tr("Screens", "details report"), 939 QString::number(cGuestScreens)); 940 } 941 942 /* 3D Acceleration: */ 943 ++iRowCount; 944 QString strAcc3d = comMachine.GetAccelerate3DEnabled() && vboxGlobal().is3DAvailable() 945 ? tr("Enabled", "details report (3D Acceleration)") 946 : tr("Disabled", "details report (3D Acceleration)"); 947 strItem += QString(sSectionItemTpl2).arg(tr("3D Acceleration", "details report"), strAcc3d); 948 949 #ifdef VBOX_WITH_VIDEOHWACCEL 950 /* 2D Video Acceleration: */ 951 ++iRowCount; 952 QString strAcc2dVideo = comMachine.GetAccelerate2DVideoEnabled() 953 ? tr("Enabled", "details report (2D Video Acceleration)") 954 : tr("Disabled", "details report (2D Video Acceleration)"); 955 strItem += QString(sSectionItemTpl2).arg(tr("2D Video Acceleration", "details report"), strAcc2dVideo); 956 #endif 957 958 /* Remote Desktop Server: */ 959 const CVRDEServer comServer = comMachine.GetVRDEServer(); 960 if (!comServer.isNull()) 961 { 962 ++iRowCount; 963 if (comServer.GetEnabled()) 964 strItem += QString(sSectionItemTpl2).arg(tr("Remote Desktop Server Port", "details report (VRDE Server)"), 965 comServer.GetVRDEProperty("TCP/Ports")); 966 else 967 strItem += QString(sSectionItemTpl2).arg(tr("Remote Desktop Server", "details report (VRDE Server)"), 968 tr("Disabled", "details report (VRDE Server)")); 969 } 970 971 /* Append report: */ 972 strReport += strSectionTpl 973 .arg(2 + iRowCount) /* rows */ 974 .arg("details://display", /* icon */ 975 "#display", /* link */ 976 tr("Display", "details report"), /* title */ 977 strItem, /* items */ 978 QString::number(iIndentMetric)); 979 } 980 981 /* Storage: */ 982 { 983 /* Nothing: */ 984 int iRowCount = 0; 985 QString strItem; 986 987 /* Iterate over the all machine controllers: */ 988 foreach (const CStorageController &comController, comMachine.GetStorageControllers()) 989 { 990 /* Add controller information: */ 991 ++iRowCount; 992 const QString strControllerName = QApplication::translate("UIMachineSettingsStorage", "Controller: %1"); 993 strItem += QString(sSectionItemTpl3).arg(strControllerName.arg(comController.GetName())); 994 995 /* Populate sorted map with attachments information: */ 996 QMap<StorageSlot,QString> attachmentsMap; 997 foreach (const CMediumAttachment &comAttachment, comMachine.GetMediumAttachmentsOfController(comController.GetName())) 998 { 999 /* Prepare current storage slot: */ 1000 const StorageSlot attachmentSlot(comController.GetBus(), comAttachment.GetPort(), comAttachment.GetDevice()); 1001 // TODO: Fix that NLS bug one day.. 1002 /* Append 'device slot name' with 'device type name' for optical devices only: */ 1003 QString strDeviceType = comAttachment.GetType() == KDeviceType_DVD ? tr("(Optical Drive)") : QString(); 1004 if (!strDeviceType.isNull()) 1005 strDeviceType.prepend(' '); 1006 /* Prepare current medium object: */ 1007 const CMedium &medium = comAttachment.GetMedium(); 1008 /* Prepare information about current medium & attachment: */ 1009 QString strAttachmentInfo = !comAttachment.isOk() 1010 ? QString() 1011 : QString(sSectionItemTpl2) 1012 .arg(QString(" ") + 1013 gpConverter->toString(StorageSlot(comController.GetBus(), 1014 comAttachment.GetPort(), 1015 comAttachment.GetDevice())) + strDeviceType) 1016 .arg(vboxGlobal().details(medium, false)); 1017 /* Insert that attachment into map: */ 1018 if (!strAttachmentInfo.isNull()) 1019 attachmentsMap.insert(attachmentSlot, strAttachmentInfo); 1020 } 1021 1022 /* Iterate over the sorted map with attachments information: */ 1023 QMapIterator<StorageSlot, QString> it(attachmentsMap); 1024 while (it.hasNext()) 1025 { 1026 /* Add controller information: */ 1027 it.next(); 1028 ++iRowCount; 1029 strItem += it.value(); 1030 } 1031 } 1032 1033 /* Handle side-case: */ 1034 if (strItem.isNull()) 1035 { 1036 ++iRowCount; 1037 strItem = QString(sSectionItemTpl1).arg(tr("Not Attached", "details report (Storage)")); 1038 } 1039 1040 /* Append report: */ 1041 strReport += strSectionTpl 1042 .arg(2 + iRowCount) /* rows */ 1043 .arg("details://storage", /* icon */ 1044 "#storage", /* link */ 1045 tr("Storage", "details report"), /* title */ 1046 strItem, /* items */ 1047 QString::number(iIndentMetric)); 1048 } 1049 1050 /* Audio: */ 1051 { 1052 /* Nothing: */ 1053 int iRowCount = 0; 1054 QString strItem; 1055 1056 /* Host Driver, Controller? */ 1057 const CAudioAdapter &comAudio = comMachine.GetAudioAdapter(); 1058 if (comAudio.GetEnabled()) 1059 { 1060 iRowCount += 2; 1061 strItem = QString(sSectionItemTpl2).arg(tr("Host Driver", "details report (audio)"), 1062 gpConverter->toString(comAudio.GetAudioDriver())) 1063 + QString(sSectionItemTpl2).arg(tr("Controller", "details report (audio)"), 1064 gpConverter->toString(comAudio.GetAudioController())); 1065 } 1066 else 1067 { 1068 ++iRowCount; 1069 strItem = QString(sSectionItemTpl1).arg(tr("Disabled", "details report (audio)")); 1070 } 1071 1072 /* Append report: */ 1073 strReport += strSectionTpl 1074 .arg(2 + iRowCount) /* rows */ 1075 .arg("details://audio", /* icon */ 1076 "#audio", /* link */ 1077 tr("Audio", "details report"), /* title */ 1078 strItem, /* items */ 1079 QString::number(iIndentMetric)); 1080 } 1081 1082 /* Network: */ 1083 { 1084 /* Nothing: */ 1085 int iRowCount = 0; 1086 QString strItem; 1087 1088 /* Enumerate all the network adapters (up to acquired/limited count): */ 1089 const ulong iCount = vboxGlobal().virtualBox().GetSystemProperties().GetMaxNetworkAdapters(comMachine.GetChipsetType()); 1090 for (ulong iSlot = 0; iSlot < iCount; ++iSlot) 1091 { 1092 /* Get current network adapter: */ 1093 const CNetworkAdapter &comNetwork = comMachine.GetNetworkAdapter(iSlot); 1094 if (comNetwork.GetEnabled()) 1095 { 1096 /* Determine attachment type: */ 1097 const KNetworkAttachmentType enmType = comNetwork.GetAttachmentType(); 1098 QString attType = gpConverter->toString(comNetwork.GetAdapterType()) 1099 .replace(QRegExp("\\s\\(.+\\)"), " (%1)"); 1100 /* Don't use the adapter type string for types that have 1101 * an additional symbolic network/interface name field, 1102 * use this name instead: */ 1103 switch (enmType) 1104 { 1105 case KNetworkAttachmentType_Bridged: 1106 attType = attType.arg(tr("Bridged adapter, %1", "details report (network)") 1107 .arg(comNetwork.GetBridgedInterface())); 1108 break; 1109 case KNetworkAttachmentType_Internal: 1110 attType = attType.arg(tr("Internal network, '%1'", "details report (network)") 1111 .arg(comNetwork.GetInternalNetwork())); 1112 break; 1113 case KNetworkAttachmentType_HostOnly: 1114 attType = attType.arg(tr("Host-only adapter, '%1'", "details report (network)") 1115 .arg(comNetwork.GetHostOnlyInterface())); 1116 break; 1117 case KNetworkAttachmentType_Generic: 1118 attType = attType.arg(tr("Generic, '%1'", "details report (network)") 1119 .arg(comNetwork.GetGenericDriver())); 1120 break; 1121 case KNetworkAttachmentType_NATNetwork: 1122 attType = attType.arg(tr("NAT network, '%1'", "details report (network)") 1123 .arg(comNetwork.GetNATNetwork())); 1124 break; 1125 default: 1126 attType = attType.arg(gpConverter->toString(enmType)); 1127 break; 1128 } 1129 /* Here goes the record: */ 1130 ++iRowCount; 1131 strItem += QString(sSectionItemTpl2).arg(tr("Adapter %1", "details report (network)") 1132 .arg(comNetwork.GetSlot() + 1), 1133 attType); 1134 } 1135 } 1136 1137 /* Handle side-case: */ 1138 if (strItem.isNull()) 1139 { 1140 ++iRowCount; 1141 strItem = QString(sSectionItemTpl1).arg(tr("Disabled", "details report (network)")); 1142 } 1143 1144 /* Append report: */ 1145 strReport += strSectionTpl 1146 .arg(2 + iRowCount) /* rows */ 1147 .arg("details://network", /* icon */ 1148 "#network", /* link */ 1149 tr("Network", "details report"), /* title */ 1150 strItem, /* items */ 1151 QString::number(iIndentMetric)); 1152 } 1153 1154 /* Serial Ports: */ 1155 { 1156 /* Nothing: */ 1157 int iRowCount = 0; 1158 QString strItem; 1159 1160 /* Enumerate all the serial ports (up to acquired/limited count): */ 1161 const ulong iCount = vboxGlobal().virtualBox().GetSystemProperties().GetSerialPortCount(); 1162 for (ulong iSlot = 0; iSlot < iCount; ++iSlot) 1163 { 1164 /* Get current serial port: */ 1165 const CSerialPort &comSerial = comMachine.GetSerialPort(iSlot); 1166 if (comSerial.GetEnabled()) 1167 { 1168 /* Determine port mode: */ 1169 const KPortMode enmMode = comSerial.GetHostMode(); 1170 /* Compose the data: */ 1171 QString strData = vboxGlobal().toCOMPortName(comSerial.GetIRQ(), comSerial.GetIOBase()) + ", "; 1172 if ( enmMode == KPortMode_HostPipe 1173 || enmMode == KPortMode_HostDevice 1174 || enmMode == KPortMode_TCP 1175 || enmMode == KPortMode_RawFile) 1176 strData += QString("%1 (<nobr>%2</nobr>)").arg(gpConverter->toString(enmMode)) 1177 .arg(QDir::toNativeSeparators(comSerial.GetPath())); 1178 else 1179 strData += gpConverter->toString(enmMode); 1180 /* Here goes the record: */ 1181 ++iRowCount; 1182 strItem += QString(sSectionItemTpl2).arg(tr("Port %1", "details report (serial ports)") 1183 .arg(comSerial.GetSlot() + 1), 1184 strData); 1185 } 1186 } 1187 1188 /* Handle side-case: */ 1189 if (strItem.isNull()) 1190 { 1191 ++iRowCount; 1192 strItem = QString(sSectionItemTpl1).arg(tr("Disabled", "details report (serial ports)")); 1193 } 1194 1195 /* Append report: */ 1196 strReport += strSectionTpl 1197 .arg(2 + iRowCount) /* rows */ 1198 .arg("details://serialPorts", /* icon */ 1199 "#serialPorts", /* link */ 1200 tr("Serial Ports", "details report"), /* title */ 1201 strItem, /* items */ 1202 QString::number(iIndentMetric)); 1203 } 1204 1205 #ifdef VBOX_WITH_PARALLEL_PORTS 1206 /* Parallel Ports: */ 1207 { 1208 /* Nothing: */ 1209 int iRowCount = 0; 1210 QString strItem; 1211 1212 /* Enumerate all the serial ports (up to acquired/limited count): */ 1213 const ulong iCount = vboxGlobal().virtualBox().GetSystemProperties().GetParallelPortCount(); 1214 for (ulong iSlot = 0; iSlot < iCount; ++iSlot) 1215 { 1216 /* Get current parallel port: */ 1217 const CParallelPort &comParallel = comMachine.GetParallelPort(iSlot); 1218 if (comParallel.GetEnabled()) 1219 { 1220 /* Compose the data: */ 1221 QString strData = toLPTPortName(comParallel.GetIRQ(), comParallel.GetIOBase()) 1222 + QString(" (<nobr>%1</nobr>)").arg(QDir::toNativeSeparators(comParallel.GetPath())); 1223 /* Here goes the record: */ 1224 ++iRowCount; 1225 strItem += QString(sSectionItemTpl2).arg(tr("Port %1", "details report (parallel ports)") 1226 .arg(comParallel.GetSlot() + 1), 1227 strData); 1228 } 1229 } 1230 1231 /* Handle side-case: */ 1232 if (strItem.isNull()) 1233 { 1234 ++iRowCount; 1235 strItem = QString(sSectionItemTpl1).arg(tr("Disabled", "details report (parallel ports)")); 1236 } 1237 1238 /* Temporary disabled: */ 1239 const QString dummy = strSectionTpl /* strReport += strSectionTpl */ 1240 .arg(2 + iRowCount) /* rows */ 1241 .arg("details://parallelPorts", /* icon */ 1242 "#parallelPorts", /* link */ 1243 tr("Parallel Ports", "details report"), /* title */ 1244 strItem, /* items */ 1245 QString::number(iIndentMetric)); 1246 Q_UNUSED(dummy); 1247 } 1248 #endif /* VBOX_WITH_PARALLEL_PORTS */ 1249 1250 /* USB */ 1251 { 1252 /* Acquire USB filters object: */ 1253 const CUSBDeviceFilters &comFilters = comMachine.GetUSBDeviceFilters(); 1254 if ( !comFilters.isNull() 1255 && comMachine.GetUSBProxyAvailable()) 1256 { 1257 /* Device Filters: */ 1258 int iRowCount = 1; 1259 QString strItem; 1260 1261 /* The USB controller may be unavailable (i.e. in VirtualBox OSE): */ 1262 if (!comMachine.GetUSBControllers().isEmpty()) 1263 { 1264 /* Acquire USB filters: */ 1265 const CUSBDeviceFilterVector &filterVector = comFilters.GetDeviceFilters(); 1266 /* Calculate the amount of active filters: */ 1267 uint cActive = 0; 1268 foreach (const CUSBDeviceFilter &comFilter, filterVector) 1269 if (comFilter.GetActive()) 1270 ++cActive; 1271 /* Here goes the record: */ 1272 strItem = QString(sSectionItemTpl2).arg(tr("Device Filters", "details report (USB)"), 1273 tr("%1 (%2 active)", "details report (USB)") 1274 .arg(filterVector.size()).arg(cActive)); 1275 } 1276 1277 /* Handle side-case: */ 1278 if (strItem.isNull()) 1279 strItem = QString(sSectionItemTpl1).arg(tr("Disabled", "details report (USB)")); 1280 1281 /* Append report: */ 1282 strReport += strSectionTpl 1283 .arg(2 + iRowCount) /* rows */ 1284 .arg("details://usb", /* icon */ 1285 "#usb", /* link */ 1286 tr("USB", "details report"), /* title */ 1287 strItem, /* items */ 1288 QString::number(iIndentMetric)); 1289 } 1290 } 1291 1292 /* Shared Folders */ 1293 { 1294 /* Shared Folders: */ 1295 int iRowCount = 1; 1296 QString strItem; 1297 1298 /* Acquire shared folders count: */ 1299 const ulong iCount = comMachine.GetSharedFolders().size(); 1300 if (iCount > 0) 1301 strItem = QString(sSectionItemTpl2).arg(tr("Shared Folders", "details report (shared folders)"), 1302 QString::number(iCount)); 1303 else 1304 strItem = QString(sSectionItemTpl1).arg(tr("None", "details report (shared folders)")); 1305 1306 /* Append report: */ 1307 strReport += strSectionTpl 1308 .arg(2 + iRowCount) /* rows */ 1309 .arg("details://sharedFolders", /* icon */ 1310 "#sfolders", /* link */ 1311 tr("Shared Folders", "details report"), /* title */ 1312 strItem, /* items */ 1313 QString::number(iIndentMetric)); 1314 } 1315 1316 /* Compose full report: */ 1317 return QString(sTableTpl).arg(strReport); 1318 } 1319 755 1320 #include "UISnapshotDetailsWidget.moc" 756 1321 -
trunk/src/VBox/Frontends/VirtualBox/src/selector/UISnapshotDetailsWidget.h
r67246 r67277 125 125 void notify(); 126 126 127 /** Returns a details report on a given @a comMachine. */ 128 QString detailsReport(const CMachine &comMachine); 129 127 130 /** Holds the snapshot object to load data from. */ 128 131 CSnapshot m_comSnapshot;
Note:
See TracChangeset
for help on using the changeset viewer.