GCI2012: Sound Option, Hear Only Music
authorkoda
Thu, 06 Dec 2012 00:52:50 +0100
changeset 8254 eeaf3e1773c6
parent 8252 db3bccd784c9 (diff)
parent 8249 9ffb156902f6 (current diff)
child 8256 19dbb3209f46
GCI2012: Sound Option, Hear Only Music
--- a/QTfrontend/ui/page/pagefeedback.cpp	Wed Dec 05 17:25:48 2012 -0500
+++ b/QTfrontend/ui/page/pagefeedback.cpp	Thu Dec 06 00:52:50 2012 +0100
@@ -20,6 +20,24 @@
 #include <QLineEdit>
 #include <QTextBrowser>
 #include <QLabel>
+#include <QSysInfo>
+#include <QApplication>
+#include <QDesktopWidget>
+#include <QProcess>
+
+#include <string>
+
+#ifdef Q_WS_WIN
+#define WINVER 0x0500
+#include <windows.h>
+#else
+#include <unistd.h>
+#include <sys/types.h>
+#endif
+
+#ifdef Q_WS_MAC
+#include <sys/sysctl.h>
+#endif
 
 #include "pagefeedback.h"
 #include "hwconsts.h"
@@ -52,6 +70,157 @@
     label_description->setText(QLabel::tr("Description"));
     pageLayout->addWidget(label_description, 0, Qt::AlignHCenter);
     description = new QTextBrowser();
+
+    // Gather some information about the system and embed it into the report
+    QDesktopWidget* screen = QApplication::desktop();
+    QString os_version = "Operating system: ";
+    QString qt_version = QString("Qt version: ") + QT_VERSION_STR + QString("\n");
+    QString total_ram = "Total RAM: ";
+    QString available_ram = "Available RAM: ";
+    QString number_of_cores = "Number of cores: ";
+    QString compiler_bits = "Compiler architecture: ";
+    QString compiler_version = "Compiler version: ";
+    QString kernel_line = "Kernel: ";
+    QString screen_size = "Size of the screen(s): " +
+        QString::number(screen->width()) + "x" + QString::number(screen->height()) + "\n";
+    QString number_of_screens = "Number of screens: " + QString::number(screen->screenCount()) + "\n";
+    std::string processor_name = "Processor: ";
+
+    // platform specific code
+#ifdef Q_WS_MACX
+    number_of_cores += QString::number(sysconf(_SC_NPROCESSORS_ONLN)) + "\n";
+
+    uint64_t memsize, memavail;
+    size_t len = sizeof(memsize);
+    static int mib_s[2] = { CTL_HW, HW_MEMSIZE };
+    static int mib_a[2] = { CTL_HW, HW_USERMEM };
+    if (sysctl (mib_s, 2, &memsize, &len, NULL, 0) == 0)
+        total_ram += QString::number(memsize/1024/1024) + " MB\n";
+    else
+        total_ram += "Error getting total RAM information\n";
+    if (sysctl (mib_a, 2, &memavail, &len, NULL, 0) == 0)
+        available_ram += QString::number(memavail/1024/1024) + " MB\n";
+    else
+        available_ram += "Error getting available RAM information\n";
+
+        int mib[] = {CTL_KERN, KERN_OSRELEASE};
+    sysctl(mib, sizeof mib / sizeof(int), NULL, &len, NULL, 0);
+
+    char *kernelVersion = (char *)malloc(sizeof(char)*len);
+    sysctl(mib, sizeof mib / sizeof(int), kernelVersion, &len, NULL, 0);
+
+    QString kernelVersionStr = QString(kernelVersion);
+    free(kernelVersion);
+    int major_version = kernelVersionStr.split(".").first().toUInt() - 4;
+    int minor_version = kernelVersionStr.split(".").at(1).toUInt();
+    os_version += QString("Mac OS X 10.%1.%2").arg(major_version).arg(minor_version) + " ";
+
+    switch(major_version)
+    {
+        case 4:  os_version += "\"Tiger\"\n"; break;
+        case 5:  os_version += "\"Leopard\"\n"; break;
+        case 6:  os_version += "\"Snow Leopard\"\n"; break;
+        case 7:  os_version += "\"Lion\"\n"; break;
+        case 8:  os_version += "\"Mountain Lion\"\n"; break;
+        default: os_version += "\"Unknown version\"\n"; break;
+    }
+#endif
+#ifdef Q_WS_WIN
+    SYSTEM_INFO sysinfo;
+    GetSystemInfo(&sysinfo);
+    number_of_cores += QString::number(sysinfo.dwNumberOfProcessors) + "\n";
+    MEMORYSTATUSEX status;
+    status.dwLength = sizeof(status);
+    GlobalMemoryStatusEx(&status);
+    total_ram = QString::number(status.ullTotalPhys);
+
+    switch(QSysInfo::WinVersion())
+    {
+        case QSysInfo::WV_2000: os_version += "Windows 2000\n"; break;
+        case QSysInfo::WV_XP: os_version += "Windows XP\n"; break;
+        case QSysInfo::WV_VISTA: os_version += "Windows Vista\n"; break;
+        case QSysInfo::WV_WINDOWS7: os_version += "Windows 7\n"; break;
+        default: os_version += "Windows (Unknown version)\n"; break;
+    }
+    kernel_line += "Windows kernel\n";
+#endif
+#ifdef Q_WS_X11
+    number_of_cores += QString::number(sysconf(_SC_NPROCESSORS_ONLN)) + "\n";
+    long pages = sysconf(_SC_PHYS_PAGES),
+         available_pages = sysconf(_SC_AVPHYS_PAGES),
+         page_size = sysconf(_SC_PAGE_SIZE);
+    total_ram += QString::number(pages * page_size) + "\n";
+    available_ram += QString::number(available_pages * page_size) + "\n";
+    os_version += "GNU/Linux or BSD\n";
+#endif
+
+    // uname -a
+#if defined(Q_WS_X11) || defined(Q_WS_MACX)
+    QProcess *process = new QProcess();
+    QStringList arguments = QStringList("-a");
+    process->start("uname", arguments);
+    if (process->waitForFinished())
+        kernel_line += QString(process->readAll());
+    delete process;
+#endif
+
+    // cpu info
+    uint32_t registers[4];
+    uint32_t i;
+
+    i = 0x80000002;
+    asm volatile
+      ("cpuid" : "=a" (registers[0]), "=b" (registers[1]), "=c" (registers[2]), "=d" (registers[3])
+       : "a" (i), "c" (0));
+    processor_name += std::string((const char *)&registers[0], 4);
+    processor_name += std::string((const char *)&registers[1], 4);
+    processor_name += std::string((const char *)&registers[2], 4);
+    processor_name += std::string((const char *)&registers[3], 4);
+    i = 0x80000003;
+    asm volatile
+      ("cpuid" : "=a" (registers[0]), "=b" (registers[1]), "=c" (registers[2]), "=d" (registers[3])
+       : "a" (i), "c" (0));
+    processor_name += std::string((const char *)&registers[0], 4);
+    processor_name += std::string((const char *)&registers[1], 4);
+    processor_name += std::string((const char *)&registers[2], 4);
+    processor_name += std::string((const char *)&registers[3], 4);
+    i = 0x80000004;
+    asm volatile
+      ("cpuid" : "=a" (registers[0]), "=b" (registers[1]), "=c" (registers[2]), "=d" (registers[3])
+       : "a" (i), "c" (0));
+    processor_name += std::string((const char *)&registers[0], 4);
+    processor_name += std::string((const char *)&registers[1], 4);
+    processor_name += std::string((const char *)&registers[2], 4);
+    processor_name += std::string((const char *)&registers[3], 3);
+
+    // compiler
+#ifdef __GNUC__
+    compiler_version += "GCC " + QString(__VERSION__) + "\n";
+#else
+    compiler_version += "Unknown\n";
+#endif
+
+    if(sizeof(void*) == 4)
+        compiler_bits += "i386\n";
+    else if(sizeof(void*) == 8)
+        compiler_bits += "x86_64\n";
+
+    // add everything to the field of text
+    description->setText(
+        "\n\n\n\n\n"
+        "System information:\n"
+        + qt_version
+        + os_version
+        + total_ram
+        + available_ram
+        + screen_size
+        + number_of_screens
+        + QString::fromStdString(processor_name + "\n")
+        + number_of_cores
+        + compiler_version
+        + compiler_bits
+        + kernel_line
+    );
     description->setReadOnly(false);
     pageLayout->addWidget(description);