QTfrontend/ui/page/pagefeedback.cpp
changeset 8252 db3bccd784c9
parent 8250 ebaec8186e4a
child 8258 c14b27abe452
equal deleted inserted replaced
8250:ebaec8186e4a 8252:db3bccd784c9
    21 #include <QTextBrowser>
    21 #include <QTextBrowser>
    22 #include <QLabel>
    22 #include <QLabel>
    23 #include <QSysInfo>
    23 #include <QSysInfo>
    24 #include <QApplication>
    24 #include <QApplication>
    25 #include <QDesktopWidget>
    25 #include <QDesktopWidget>
       
    26 #include <QProcess>
       
    27 
    26 #include <string>
    28 #include <string>
    27 
       
    28 #ifndef Q_WS_WIN
       
    29 #include <unistd.h>
       
    30 #endif
       
    31 
    29 
    32 #ifdef Q_WS_WIN
    30 #ifdef Q_WS_WIN
    33 #define WINVER 0x0500
    31 #define WINVER 0x0500
    34 #include <windows.h>
    32 #include <windows.h>
       
    33 #else
       
    34 #include <unistd.h>
       
    35 #include <sys/types.h>
    35 #endif
    36 #endif
    36 
    37 
    37 #ifdef Q_WS_MAC
    38 #ifdef Q_WS_MAC
    38      #include <sys/types.h>
    39 #include <sys/sysctl.h>
    39      #include <sys/sysctl.h>
       
    40 #endif
    40 #endif
    41 
    41 
    42 #include "pagefeedback.h"
    42 #include "pagefeedback.h"
    43 #include "hwconsts.h"
    43 #include "hwconsts.h"
    44 
    44 
    68 
    68 
    69     label_description = new QLabel();
    69     label_description = new QLabel();
    70     label_description->setText(QLabel::tr("Description"));
    70     label_description->setText(QLabel::tr("Description"));
    71     pageLayout->addWidget(label_description, 0, Qt::AlignHCenter);
    71     pageLayout->addWidget(label_description, 0, Qt::AlignHCenter);
    72     description = new QTextBrowser();
    72     description = new QTextBrowser();
       
    73 
       
    74     // Gather some information about the system and embed it into the report
    73     QDesktopWidget* screen = QApplication::desktop();
    75     QDesktopWidget* screen = QApplication::desktop();
    74     QString os_version = "Operating system: ";
    76     QString os_version = "Operating system: ";
    75     QString qt_version = QString("Qt version: ") + QT_VERSION_STR + QString("\n");
    77     QString qt_version = QString("Qt version: ") + QT_VERSION_STR + QString("\n");
    76     QString total_ram = "Total RAM: unknown\n";
    78     QString total_ram = "Total RAM: ";
    77     QString available_ram = "Available RAM: unknown\n";
    79     QString available_ram = "Available RAM: ";
    78     QString number_of_cores = "Number of cores: unknown";
    80     QString number_of_cores = "Number of cores: ";
       
    81     QString compiler_bits = "Compiler architecture: ";
       
    82     QString compiler_version = "Compiler version: ";
       
    83     QString kernel_line = "Kernel: ";
    79     QString screen_size = "Size of the screen(s): " +
    84     QString screen_size = "Size of the screen(s): " +
    80         QString::number(screen->width()) + "x" + QString::number(screen->height()) + "\n";
    85         QString::number(screen->width()) + "x" + QString::number(screen->height()) + "\n";
    81     QString number_of_screens = "Number of screens: " +
    86     QString number_of_screens = "Number of screens: " + QString::number(screen->screenCount()) + "\n";
    82         QString::number(screen->screenCount()) + "\n";
    87     std::string processor_name = "Processor: ";
       
    88 
       
    89     // platform specific code
    83 #ifdef Q_WS_MACX
    90 #ifdef Q_WS_MACX
    84     number_of_cores = "Number of cores: " +
    91     number_of_cores += QString::number(sysconf(_SC_NPROCESSORS_ONLN)) + "\n";
    85     QString::number(sysconf(_SC_NPROCESSORS_ONLN));
       
    86 
    92 
    87     uint64_t memsize, memavail;
    93     uint64_t memsize, memavail;
    88     size_t len = sizeof(memsize);
    94     size_t len = sizeof(memsize);
    89     static int mib_s[2] = { CTL_HW, HW_MEMSIZE };
    95     static int mib_s[2] = { CTL_HW, HW_MEMSIZE };
    90     static int mib_a[2] = { CTL_HW, HW_USERMEM };
    96     static int mib_a[2] = { CTL_HW, HW_USERMEM };
    91     if (sysctl (mib_s, 2, &memsize, &len, NULL, 0) == 0)
    97     if (sysctl (mib_s, 2, &memsize, &len, NULL, 0) == 0)
    92         total_ram = "Total RAM: " + QString::number(memsize/1024/1024) + " MB\n";
    98         total_ram += QString::number(memsize/1024/1024) + " MB\n";
    93     else
    99     else
    94         total_ram = "Error getting total RAM information\n";
   100         total_ram += "Error getting total RAM information\n";
    95     if (sysctl (mib_a, 2, &memavail, &len, NULL, 0) == 0)    
   101     if (sysctl (mib_a, 2, &memavail, &len, NULL, 0) == 0)
    96         available_ram = "Available RAM: " + QString::number(memavail/1024/1024) + " MB\n";
   102         available_ram += QString::number(memavail/1024/1024) + " MB\n";
    97     else
   103     else
    98         available_ram = "Error getting available RAM information\n";
   104         available_ram += "Error getting available RAM information\n";
    99     
   105 
   100         int mib[] = {CTL_KERN, KERN_OSRELEASE};
   106         int mib[] = {CTL_KERN, KERN_OSRELEASE};
   101     sysctl(mib, sizeof mib / sizeof(int), NULL, &len, NULL, 0);
   107     sysctl(mib, sizeof mib / sizeof(int), NULL, &len, NULL, 0);
   102 
   108 
   103     char *kernelVersion = (char *)malloc(sizeof(char)*len);
   109     char *kernelVersion = (char *)malloc(sizeof(char)*len);
   104     sysctl(mib, sizeof mib / sizeof(int), kernelVersion, &len, NULL, 0);
   110     sysctl(mib, sizeof mib / sizeof(int), kernelVersion, &len, NULL, 0);
   120     }
   126     }
   121 #endif
   127 #endif
   122 #ifdef Q_WS_WIN
   128 #ifdef Q_WS_WIN
   123     SYSTEM_INFO sysinfo;
   129     SYSTEM_INFO sysinfo;
   124     GetSystemInfo(&sysinfo);
   130     GetSystemInfo(&sysinfo);
   125     number_of_cores = "Number of cores: " + QString::number(sysinfo.dwNumberOfProcessors) + "\n";
   131     number_of_cores += QString::number(sysinfo.dwNumberOfProcessors) + "\n";
   126     MEMORYSTATUSEX status;
   132     MEMORYSTATUSEX status;
   127     status.dwLength = sizeof(status);
   133     status.dwLength = sizeof(status);
   128     GlobalMemoryStatusEx(&status);
   134     GlobalMemoryStatusEx(&status);
   129     total_ram = QString::number(status.ullTotalPhys);
   135     total_ram = QString::number(status.ullTotalPhys);
   130 
   136 
   131     switch(QSysInfo::WinVersion())
   137     switch(QSysInfo::WinVersion())
   132     {
   138     {
   133         case QSysInfo::WV_2000: 
   139         case QSysInfo::WV_2000: os_version += "Windows 2000\n"; break;
   134             os_version += "Windows 2000\n";
   140         case QSysInfo::WV_XP: os_version += "Windows XP\n"; break;
   135             break;
   141         case QSysInfo::WV_VISTA: os_version += "Windows Vista\n"; break;
   136         case QSysInfo::WV_XP: 
   142         case QSysInfo::WV_WINDOWS7: os_version += "Windows 7\n"; break;
   137             os_version += "Windows XP\n";
   143         default: os_version += "Windows (Unknown version)\n"; break;
   138             break;
       
   139         case QSysInfo::WV_VISTA: 
       
   140             os_version += "Windows Vista\n";
       
   141             break;
       
   142         case QSysInfo::WV_WINDOWS7: 
       
   143             os_version += "Windows 7\n";
       
   144             break;
       
   145         default:
       
   146             os_version += "Windows\n";
       
   147     }
   144     }
       
   145     kernel_line += "Windows kernel\n";
   148 #endif
   146 #endif
   149 #ifdef Q_WS_X11
   147 #ifdef Q_WS_X11
   150     number_of_cores = "Number of cores: " + QString::number(sysconf(_SC_NPROCESSORS_ONLN)) + "\n";
   148     number_of_cores += QString::number(sysconf(_SC_NPROCESSORS_ONLN)) + "\n";
   151     long pages = sysconf(_SC_PHYS_PAGES),
   149     long pages = sysconf(_SC_PHYS_PAGES),
   152          available_pages = sysconf(_SC_AVPHYS_PAGES),
   150          available_pages = sysconf(_SC_AVPHYS_PAGES),
   153          page_size = sysconf(_SC_PAGE_SIZE);
   151          page_size = sysconf(_SC_PAGE_SIZE);
   154     total_ram = "Total RAM: " + QString::number(pages * page_size) + "\n";
   152     total_ram += QString::number(pages * page_size) + "\n";
   155     available_ram = "Available RAM: " + QString::number(available_pages * page_size) + "\n";
   153     available_ram += QString::number(available_pages * page_size) + "\n";
   156     os_version += "Linux\n";
   154     os_version += "GNU/Linux or BSD\n";
   157 #endif
   155 #endif
   158     
   156 
   159     /* Get the processor's type string using the CPUID instruction. */
   157     // uname -a
   160     std::string processor_name = "Processor: ";
   158 #if defined(Q_WS_X11) || defined(Q_WS_MACX)
       
   159     QProcess *process = new QProcess();
       
   160     QStringList arguments = QStringList("-a");
       
   161     process->start("uname", arguments);
       
   162     if (process->waitForFinished())
       
   163         kernel_line += QString(process->readAll());
       
   164     delete process;
       
   165 #endif
       
   166 
       
   167     // cpu info
   161     uint32_t registers[4];
   168     uint32_t registers[4];
   162     unsigned i;
   169     uint32_t i;
   163 
   170 
   164     i = 0x80000002;
   171     i = 0x80000002;
   165     asm volatile
   172     asm volatile
   166       ("cpuid" : "=a" (registers[0]), "=b" (registers[1]), "=c" (registers[2]), "=d" (registers[3])
   173       ("cpuid" : "=a" (registers[0]), "=b" (registers[1]), "=c" (registers[2]), "=d" (registers[3])
   167        : "a" (i), "c" (0));
   174        : "a" (i), "c" (0));
   183        : "a" (i), "c" (0));
   190        : "a" (i), "c" (0));
   184     processor_name += std::string((const char *)&registers[0], 4);
   191     processor_name += std::string((const char *)&registers[0], 4);
   185     processor_name += std::string((const char *)&registers[1], 4);
   192     processor_name += std::string((const char *)&registers[1], 4);
   186     processor_name += std::string((const char *)&registers[2], 4);
   193     processor_name += std::string((const char *)&registers[2], 4);
   187     processor_name += std::string((const char *)&registers[3], 3);
   194     processor_name += std::string((const char *)&registers[3], 3);
   188     
   195 
   189     QString processor_bits = "Number of bits: unknown";
   196     // compiler
   190     
   197 #ifdef __GNUC__
       
   198     compiler_version += "GCC " + QString(__VERSION__) + "\n";
       
   199 #else
       
   200     compiler_version += "Unknown\n";
       
   201 #endif
       
   202 
   191     if(sizeof(void*) == 4)
   203     if(sizeof(void*) == 4)
   192         processor_bits = "Number of bits: 32 (probably)";
   204         compiler_bits += "i386\n";
   193     else
   205     else if(sizeof(void*) == 8)
   194         if(sizeof(void*) == 8)
   206         compiler_bits += "x86_64\n";
   195             processor_bits = "Number of bits: 64 (probably)";
   207 
   196     
   208     // add everything to the field of text
   197     description->setText(
   209     description->setText(
   198         "\n\n\n"
   210         "\n\n\n\n\n"
   199         "System information:\n"
   211         "System information:\n"
   200         + qt_version
   212         + qt_version
   201         + os_version
   213         + os_version
   202         + total_ram
   214         + total_ram
   203         + available_ram
   215         + available_ram
   204         + screen_size
   216         + screen_size
   205         + number_of_screens
   217         + number_of_screens
       
   218         + QString::fromStdString(processor_name + "\n")
   206         + number_of_cores
   219         + number_of_cores
   207         + QString::fromStdString(processor_name + "\n")
   220         + compiler_version
   208         + processor_bits
   221         + compiler_bits
       
   222         + kernel_line
   209     );
   223     );
   210     description->setReadOnly(false);
   224     description->setReadOnly(false);
   211     pageLayout->addWidget(description);
   225     pageLayout->addWidget(description);
   212 
   226 
   213     return pageLayout;
   227     return pageLayout;