VirtualBox

Changeset 67277 in vbox for trunk/src


Ignore:
Timestamp:
Jun 6, 2017 4:39:59 PM (8 years ago)
Author:
vboxsync
Message:

FE/Qt: Selector UI: Tools pane: Snapshot pane: Moving details related stuff to corresponding place.

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  
    966966}
    967967
    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>&nbsp;</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>&nbsp;</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() > 1
    1013             || (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 += strSectionTpl
    1022             .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_REPORT
    1066 
    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 += strSectionTpl
    1119             .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_VIDEOHWACCEL
    1152         /* 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 #endif
    1159 
    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             else
    1169                 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 += strSectionTpl
    1175             .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("&nbsp;&nbsp;") +
    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 += strSectionTpl
    1244             .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         else
    1269         {
    1270             ++iRowCount;
    1271             strItem = QString(sSectionItemTpl1).arg(tr("Disabled", "details report (audio)"));
    1272         }
    1273 
    1274         /* Append report: */
    1275         strReport += strSectionTpl
    1276             .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 have
    1303                  * 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 += strSectionTpl
    1348             .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_HostPipe
    1375                     || enmMode == KPortMode_HostDevice
    1376                     || enmMode == KPortMode_TCP
    1377                     || enmMode == KPortMode_RawFile)
    1378                     strData += QString("%1 (<nobr>%2</nobr>)").arg(gpConverter->toString(enmMode))
    1379                                                               .arg(QDir::toNativeSeparators(comSerial.GetPath()));
    1380                 else
    1381                     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 += strSectionTpl
    1399             .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 += strSectionTpl
    1483                 .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         else
    1504             strItem = QString(sSectionItemTpl1).arg(tr("None", "details report (shared folders)"));
    1505 
    1506         /* Append report: */
    1507         strReport += strSectionTpl
    1508             .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 
    1520968CSession VBoxGlobal::openSession(const QString &strId, KLockType lockType /* = KLockType_Shared */)
    1521969{
  • trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h

    r67212 r67277  
    310310    QString toolTip (const CUSBDeviceFilter &aFilter) const;
    311311    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);
    317312
    318313    /* VirtualBox helpers */
  • trunk/src/VBox/Frontends/VirtualBox/src/selector/UISnapshotDetailsWidget.cpp

    r67246 r67277  
    2323# include <QHBoxLayout>
    2424# include <QDateTime>
     25# include <QDir>
    2526# include <QGridLayout>
    2627# include <QLabel>
     
    4445
    4546/* COM includes: */
     47# include "CAudioAdapter.h"
    4648# 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"
    4763
    4864#endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
     
    382398
    383399        /* Rebuild the details report: */
    384         m_pBrowserDetails->setText(vboxGlobal().detailsReport(comMachine, false /* with links? */));
     400        m_pBrowserDetails->setText(detailsReport(comMachine));
    385401    }
    386402    else
     
    626642#ifdef VBOX_WITH_PARALLEL_PORTS
    627643                      << DetailsElementType_Parallel
    628 #endif /* VBOX_WITH_PARALLEL_PORTS */
     644#endif
    629645                      << DetailsElementType_USB
    630646                      << DetailsElementType_SF
     
    753769}
    754770
     771QString 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>&nbsp;</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("&nbsp;&nbsp;") +
     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
    7551320#include "UISnapshotDetailsWidget.moc"
    7561321
  • trunk/src/VBox/Frontends/VirtualBox/src/selector/UISnapshotDetailsWidget.h

    r67246 r67277  
    125125    void notify();
    126126
     127    /** Returns a details report on a given @a comMachine. */
     128    QString detailsReport(const CMachine &comMachine);
     129
    127130    /** Holds the snapshot object to load data from. */
    128131    CSnapshot  m_comSnapshot;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette