mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-18 01:22:38 -05:00
Add System Info screen showing some values that could be helpful in case of problems using rbutil. Most noteable is showing the permission level of the user on windows.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17736 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
5b2d06ad51
commit
1876a0bcf2
12 changed files with 436 additions and 134 deletions
|
|
@ -40,6 +40,7 @@
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <setupapi.h>
|
#include <setupapi.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
Autodetection::Autodetection(QObject* parent): QObject(parent)
|
Autodetection::Autodetection(QObject* parent): QObject(parent)
|
||||||
{
|
{
|
||||||
|
|
@ -265,132 +266,27 @@ bool Autodetection::detectUsb()
|
||||||
QMap<int, QString> usbincompat = settings->usbIdIncompatMap();
|
QMap<int, QString> usbincompat = settings->usbIdIncompatMap();
|
||||||
|
|
||||||
// usb pid detection
|
// usb pid detection
|
||||||
#if defined(Q_OS_LINUX) | defined(Q_OS_MACX)
|
QList<uint32_t> attached;
|
||||||
usb_init();
|
attached = listUsbIds();
|
||||||
usb_find_busses();
|
|
||||||
usb_find_devices();
|
|
||||||
struct usb_bus *b;
|
|
||||||
b = usb_get_busses();
|
|
||||||
|
|
||||||
while(b) {
|
int i = attached.size();
|
||||||
qDebug() << "bus:" << b->dirname << b->devices;
|
while(i--) {
|
||||||
if(b->devices) {
|
if(usbids.contains(attached.at(i))) {
|
||||||
qDebug() << "devices present.";
|
m_device = usbids.value(attached.at(i));
|
||||||
struct usb_device *u;
|
qDebug() << "[USB] detected supported player" << m_device;
|
||||||
u = b->devices;
|
return true;
|
||||||
while(u) {
|
}
|
||||||
uint32_t id;
|
if(usberror.contains(attached.at(i))) {
|
||||||
id = u->descriptor.idVendor << 16 | u->descriptor.idProduct;
|
m_errdev = usberror.value(attached.at(i));
|
||||||
m_usbconid.append(id);
|
qDebug() << "[USB] detected problem with player" << m_errdev;
|
||||||
qDebug("%x", id);
|
return true;
|
||||||
|
}
|
||||||
if(usbids.contains(id)) {
|
if(usbincompat.contains(attached.at(i))) {
|
||||||
m_device = usbids.value(id);
|
m_incompat = usbincompat.value(attached.at(i));
|
||||||
return true;
|
qDebug() << "[USB] detected incompatible player" << m_incompat;
|
||||||
}
|
return true;
|
||||||
if(usberror.contains(id)) {
|
|
||||||
m_errdev = usberror.value(id);
|
|
||||||
// we detected something, so return true
|
|
||||||
qDebug() << "detected device with problems via usb!";
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if(usbincompat.contains(id)) {
|
|
||||||
m_incompat = usbincompat.value(id);
|
|
||||||
qDebug() << "detected incompatible player variant";
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
u = u->next;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
b = b->next;
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(Q_OS_WIN32)
|
|
||||||
HDEVINFO deviceInfo;
|
|
||||||
SP_DEVINFO_DATA infoData;
|
|
||||||
DWORD i;
|
|
||||||
|
|
||||||
// Iterate over all devices
|
|
||||||
// by doing it this way it's unneccessary to use GUIDs which might be not
|
|
||||||
// present in current MinGW. It also seemed to be more reliably than using
|
|
||||||
// a GUID.
|
|
||||||
// See KB259695 for an example.
|
|
||||||
deviceInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
|
|
||||||
|
|
||||||
infoData.cbSize = sizeof(SP_DEVINFO_DATA);
|
|
||||||
|
|
||||||
for(i = 0; SetupDiEnumDeviceInfo(deviceInfo, i, &infoData); i++) {
|
|
||||||
DWORD data;
|
|
||||||
LPTSTR buffer = NULL;
|
|
||||||
DWORD buffersize = 0;
|
|
||||||
|
|
||||||
// get device desriptor first
|
|
||||||
// for some reason not doing so results in bad things (tm)
|
|
||||||
while(!SetupDiGetDeviceRegistryProperty(deviceInfo, &infoData,
|
|
||||||
SPDRP_DEVICEDESC,&data, (PBYTE)buffer, buffersize, &buffersize)) {
|
|
||||||
if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
|
|
||||||
if(buffer) free(buffer);
|
|
||||||
// double buffer size to avoid problems as per KB888609
|
|
||||||
buffer = (LPTSTR)malloc(buffersize * 2);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// now get the hardware id, which contains PID and VID.
|
|
||||||
while(!SetupDiGetDeviceRegistryProperty(deviceInfo, &infoData,
|
|
||||||
SPDRP_HARDWAREID,&data, (PBYTE)buffer, buffersize, &buffersize)) {
|
|
||||||
if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
|
|
||||||
if(buffer) free(buffer);
|
|
||||||
// double buffer size to avoid problems as per KB888609
|
|
||||||
buffer = (LPTSTR)malloc(buffersize * 2);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int vid, pid, rev;
|
|
||||||
if(_stscanf(buffer, _TEXT("USB\\Vid_%x&Pid_%x&Rev_%x"), &vid, &pid, &rev) != 3) {
|
|
||||||
qDebug() << "Error getting USB ID -- possibly no USB device";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
uint32_t id;
|
|
||||||
id = vid << 16 | pid;
|
|
||||||
m_usbconid.append(id);
|
|
||||||
qDebug("VID: %04x PID: %04x", vid, pid);
|
|
||||||
if(usbids.contains(id)) {
|
|
||||||
m_device = usbids.value(id);
|
|
||||||
if(buffer) free(buffer);
|
|
||||||
SetupDiDestroyDeviceInfoList(deviceInfo);
|
|
||||||
qDebug() << "detectUsb: Got" << m_device;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if(usberror.contains(id)) {
|
|
||||||
m_errdev = usberror.value(id);
|
|
||||||
// we detected something, so return true
|
|
||||||
if(buffer) free(buffer);
|
|
||||||
SetupDiDestroyDeviceInfoList(deviceInfo);
|
|
||||||
qDebug() << "detectUsb: Got" << m_device;
|
|
||||||
qDebug() << "detected device with problems via usb!";
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if(usbincompat.contains(id)) {
|
|
||||||
m_incompat = usbincompat.value(id);
|
|
||||||
// we detected an incompatible player variant
|
|
||||||
if(buffer) free(buffer);
|
|
||||||
SetupDiDestroyDeviceInfoList(deviceInfo);
|
|
||||||
qDebug() << "detectUsb: detected incompatible variant";
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(buffer) free(buffer);
|
|
||||||
}
|
|
||||||
SetupDiDestroyDeviceInfoList(deviceInfo);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
BIN
rbutil/rbutilqt/icons/view-refresh.png
Normal file
BIN
rbutil/rbutilqt/icons/view-refresh.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 912 B |
|
|
@ -34,6 +34,8 @@
|
||||||
#include "browseof.h"
|
#include "browseof.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "rbzip.h"
|
#include "rbzip.h"
|
||||||
|
#include "sysinfo.h"
|
||||||
|
|
||||||
|
|
||||||
#if defined(Q_OS_LINUX)
|
#if defined(Q_OS_LINUX)
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
@ -101,6 +103,7 @@ RbUtilQt::RbUtilQt(QWidget *parent) : QMainWindow(parent)
|
||||||
connect(ui.actionCreate_Talk_Files, SIGNAL(triggered()), this, SLOT(createTalkFiles()));
|
connect(ui.actionCreate_Talk_Files, SIGNAL(triggered()), this, SLOT(createTalkFiles()));
|
||||||
connect(ui.actionRemove_bootloader, SIGNAL(triggered()), this, SLOT(uninstallBootloader()));
|
connect(ui.actionRemove_bootloader, SIGNAL(triggered()), this, SLOT(uninstallBootloader()));
|
||||||
connect(ui.actionUninstall_Rockbox, SIGNAL(triggered()), this, SLOT(uninstall()));
|
connect(ui.actionUninstall_Rockbox, SIGNAL(triggered()), this, SLOT(uninstall()));
|
||||||
|
connect(ui.action_System_Info, SIGNAL(triggered()), this, SLOT(sysinfo()));
|
||||||
|
|
||||||
#if !defined(STATIC)
|
#if !defined(STATIC)
|
||||||
ui.actionInstall_Rockbox_Utility_on_player->setEnabled(false);
|
ui.actionInstall_Rockbox_Utility_on_player->setEnabled(false);
|
||||||
|
|
@ -115,6 +118,12 @@ RbUtilQt::RbUtilQt(QWidget *parent) : QMainWindow(parent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RbUtilQt::sysinfo(void)
|
||||||
|
{
|
||||||
|
Sysinfo *info = new Sysinfo(this);
|
||||||
|
info->show();
|
||||||
|
}
|
||||||
|
|
||||||
void RbUtilQt::updateTabs(int count)
|
void RbUtilQt::updateTabs(int count)
|
||||||
{
|
{
|
||||||
switch(count) {
|
switch(count) {
|
||||||
|
|
|
||||||
|
|
@ -66,6 +66,7 @@ class RbUtilQt : public QMainWindow
|
||||||
private slots:
|
private slots:
|
||||||
void about(void);
|
void about(void);
|
||||||
void help(void);
|
void help(void);
|
||||||
|
void sysinfo(void);
|
||||||
void configDialog(void);
|
void configDialog(void);
|
||||||
void updateDevice(void);
|
void updateDevice(void);
|
||||||
void updateSettings(void);
|
void updateSettings(void);
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,8 @@ SOURCES += rbutilqt.cpp \
|
||||||
createvoicewindow.cpp \
|
createvoicewindow.cpp \
|
||||||
rbsettings.cpp \
|
rbsettings.cpp \
|
||||||
rbunzip.cpp \
|
rbunzip.cpp \
|
||||||
rbzip.cpp
|
rbzip.cpp \
|
||||||
|
sysinfo.cpp
|
||||||
|
|
||||||
HEADERS += rbutilqt.h \
|
HEADERS += rbutilqt.h \
|
||||||
install.h \
|
install.h \
|
||||||
|
|
@ -109,7 +110,8 @@ HEADERS += rbutilqt.h \
|
||||||
createvoicewindow.h \
|
createvoicewindow.h \
|
||||||
rbsettings.h \
|
rbsettings.h \
|
||||||
rbunzip.h \
|
rbunzip.h \
|
||||||
rbzip.h
|
rbzip.h \
|
||||||
|
sysinfo.h
|
||||||
|
|
||||||
# Needed by QT on Win
|
# Needed by QT on Win
|
||||||
INCLUDEPATH = . irivertools zip zlib ../ipodpatcher ../sansapatcher ../../tools/rbspeex ../../tools
|
INCLUDEPATH = . irivertools zip zlib ../ipodpatcher ../sansapatcher ../../tools/rbspeex ../../tools
|
||||||
|
|
@ -145,7 +147,8 @@ FORMS += rbutilqtfrm.ui \
|
||||||
encexescfgfrm.ui \
|
encexescfgfrm.ui \
|
||||||
ttsexescfgfrm.ui \
|
ttsexescfgfrm.ui \
|
||||||
sapicfgfrm.ui \
|
sapicfgfrm.ui \
|
||||||
createvoicefrm.ui
|
createvoicefrm.ui \
|
||||||
|
sysinfofrm.ui
|
||||||
|
|
||||||
RESOURCES += rbutilqt.qrc
|
RESOURCES += rbutilqt.qrc
|
||||||
win32 {
|
win32 {
|
||||||
|
|
@ -164,7 +167,7 @@ win32 {
|
||||||
SOURCES += ../ipodpatcher/ipodio-win32.c
|
SOURCES += ../ipodpatcher/ipodio-win32.c
|
||||||
SOURCES += ../sansapatcher/sansaio-win32.c
|
SOURCES += ../sansapatcher/sansaio-win32.c
|
||||||
RC_FILE = rbutilqt.rc
|
RC_FILE = rbutilqt.rc
|
||||||
LIBS += -lsetupapi
|
LIBS += -lsetupapi -lnetapi32
|
||||||
}
|
}
|
||||||
|
|
||||||
unix {
|
unix {
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@
|
||||||
<file>icons/talkfile_btn.png</file>
|
<file>icons/talkfile_btn.png</file>
|
||||||
<file>icons/themes_btn.png</file>
|
<file>icons/themes_btn.png</file>
|
||||||
<file>icons/user-trash-full.png</file>
|
<file>icons/user-trash-full.png</file>
|
||||||
|
<file>icons/view-refresh.png</file>
|
||||||
<file>icons/wizard.xpm</file>
|
<file>icons/wizard.xpm</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
<qresource prefix="/ini" >
|
<qresource prefix="/ini" >
|
||||||
|
|
|
||||||
|
|
@ -94,9 +94,9 @@
|
||||||
<item row="0" column="1" >
|
<item row="0" column="1" >
|
||||||
<widget class="QLabel" name="labelDevice" >
|
<widget class="QLabel" name="labelDevice" >
|
||||||
<property name="text" >
|
<property name="text" >
|
||||||
<string><html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
<string><html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
||||||
p, li { white-space: pre-wrap; }
|
p, li { white-space: pre-wrap; }
|
||||||
</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
|
</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">none</span> at <span style=" font-weight:600;">unknown</span></p></body></html></string>
|
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">none</span> at <span style=" font-weight:600;">unknown</span></p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
|
|
@ -539,7 +539,7 @@ p, li { white-space: pre-wrap; }
|
||||||
<item row="1" column="1" >
|
<item row="1" column="1" >
|
||||||
<widget class="QLabel" name="labelCreateVoice" >
|
<widget class="QLabel" name="labelCreateVoice" >
|
||||||
<property name="text" >
|
<property name="text" >
|
||||||
<string><b>Create Voice file</b><br/>Voice files are needed to make Rockbox speak the user interface. Speaking is enabled by default, so
|
<string><b>Create Voice file</b><br/>Voice files are needed to make Rockbox speak the user interface. Speaking is enabled by default, so
|
||||||
if you installed the voice file Rockbox will speak.</string>
|
if you installed the voice file Rockbox will speak.</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap" >
|
<property name="wordWrap" >
|
||||||
|
|
@ -806,6 +806,7 @@ p, li { white-space: pre-wrap; }
|
||||||
<addaction name="action_About" />
|
<addaction name="action_About" />
|
||||||
<addaction name="actionAbout_Qt" />
|
<addaction name="actionAbout_Qt" />
|
||||||
<addaction name="separator" />
|
<addaction name="separator" />
|
||||||
|
<addaction name="action_System_Info" />
|
||||||
<addaction name="action_Help" />
|
<addaction name="action_Help" />
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menuA_ctions" >
|
<widget class="QMenu" name="menuA_ctions" >
|
||||||
|
|
@ -1022,6 +1023,11 @@ p, li { white-space: pre-wrap; }
|
||||||
<string>Create Voice File</string>
|
<string>Create Voice File</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="action_System_Info" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&System Info</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<tabstops>
|
<tabstops>
|
||||||
<tabstop>tabWidget</tabstop>
|
<tabstop>tabWidget</tabstop>
|
||||||
|
|
|
||||||
54
rbutil/rbutilqt/sysinfo.cpp
Normal file
54
rbutil/rbutilqt/sysinfo.cpp
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* __________ __ ___.
|
||||||
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
|
* \/ \/ \/ \/ \/
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 by Dominik Riebeling
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* All files in this archive are subject to the GNU General Public License.
|
||||||
|
* See the file COPYING in the source tree root for full license agreement.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <QtGui>
|
||||||
|
#include "sysinfo.h"
|
||||||
|
#include "ui_sysinfofrm.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
|
||||||
|
Sysinfo::Sysinfo(QWidget *parent) : QDialog(parent)
|
||||||
|
{
|
||||||
|
ui.setupUi(this);
|
||||||
|
this->setModal(true);
|
||||||
|
|
||||||
|
updateSysinfo();
|
||||||
|
connect(ui.buttonOk, SIGNAL(clicked()), this, SLOT(close()));
|
||||||
|
connect(ui.buttonRefresh, SIGNAL(clicked()), this, SLOT(updateSysinfo()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Sysinfo::updateSysinfo(void)
|
||||||
|
{
|
||||||
|
QString info;
|
||||||
|
info += tr("<b>OS</b><br/>") + getOsVersionString() + "<hr/>";
|
||||||
|
info += tr("<b>Username:</b><br/>%1<hr/>").arg(getUserName());
|
||||||
|
#if defined(Q_OS_WIN32)
|
||||||
|
info += tr("<b>Permissions:</b><br/>%1<hr/>").arg(getUserPermissionsString());
|
||||||
|
#endif
|
||||||
|
info += tr("<b>Attached USB devices:</b><br/>");
|
||||||
|
QList<uint32_t> usbids = listUsbIds();
|
||||||
|
for(int i = 0; i < usbids.size(); i++)
|
||||||
|
info += tr("VID: %1 PID: %2<br/>")
|
||||||
|
.arg((usbids.at(i)&0xffff0000)>>16, 4, 16, QChar('0'))
|
||||||
|
.arg(usbids.at(i)&0xffff, 4, 16, QChar('0'));
|
||||||
|
|
||||||
|
ui.textBrowser->setHtml(info);
|
||||||
|
}
|
||||||
|
|
||||||
42
rbutil/rbutilqt/sysinfo.h
Normal file
42
rbutil/rbutilqt/sysinfo.h
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* __________ __ ___.
|
||||||
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
|
* \/ \/ \/ \/ \/
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 by Dominik Riebeling
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* All files in this archive are subject to the GNU General Public License.
|
||||||
|
* See the file COPYING in the source tree root for full license agreement.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef SYSINFO_H
|
||||||
|
#define SYSINFO_H
|
||||||
|
|
||||||
|
#include <QtGui>
|
||||||
|
#include "ui_sysinfofrm.h"
|
||||||
|
|
||||||
|
class Sysinfo : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
Sysinfo(QWidget *parent = 0);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::SysinfoFrm ui;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void updateSysinfo(void);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
66
rbutil/rbutilqt/sysinfofrm.ui
Normal file
66
rbutil/rbutilqt/sysinfofrm.ui
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
<ui version="4.0" >
|
||||||
|
<class>SysinfoFrm</class>
|
||||||
|
<widget class="QWidget" name="SysinfoFrm" >
|
||||||
|
<property name="geometry" >
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>400</width>
|
||||||
|
<height>300</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle" >
|
||||||
|
<string>System Info</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" >
|
||||||
|
<item row="0" column="0" colspan="3" >
|
||||||
|
<widget class="QTextBrowser" name="textBrowser" />
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" >
|
||||||
|
<widget class="QPushButton" name="buttonRefresh" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&Refresh</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon" >
|
||||||
|
<iconset resource="rbutilqt.qrc" >:/icons/view-refresh.png</iconset>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1" >
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2" >
|
||||||
|
<widget class="QPushButton" name="buttonOk" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>&OK</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon" >
|
||||||
|
<iconset resource="rbutilqt.qrc" >:/icons/go-next.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="default" >
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<tabstops>
|
||||||
|
<tabstop>buttonOk</tabstop>
|
||||||
|
<tabstop>buttonRefresh</tabstop>
|
||||||
|
<tabstop>textBrowser</tabstop>
|
||||||
|
</tabstops>
|
||||||
|
<resources>
|
||||||
|
<include location="rbutilqt.qrc" />
|
||||||
|
</resources>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
||||||
|
|
@ -19,9 +19,10 @@
|
||||||
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QDebug>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <stdio.h>
|
||||||
#include <QDir>
|
|
||||||
|
|
||||||
#if defined(Q_OS_WIN32)
|
#if defined(Q_OS_WIN32)
|
||||||
#if defined(UNICODE)
|
#if defined(UNICODE)
|
||||||
|
|
@ -29,8 +30,29 @@
|
||||||
#endif
|
#endif
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
|
#include <lm.h>
|
||||||
|
#endif
|
||||||
|
#if defined(Q_OS_LINUX) || defined(Q_OS_MACX)
|
||||||
|
#include <usb.h>
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
#if defined(Q_OS_LINUX)
|
||||||
|
#include <mntent.h>
|
||||||
|
#endif
|
||||||
|
#if defined(Q_OS_MACX)
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/ucred.h>
|
||||||
|
#include <sys/mount.h>
|
||||||
|
#endif
|
||||||
|
#if defined(Q_OS_WIN32)
|
||||||
|
#if defined(UNICODE)
|
||||||
|
#define _UNICODE
|
||||||
|
#endif
|
||||||
|
#include <tchar.h>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <setupapi.h>
|
||||||
#endif
|
#endif
|
||||||
#include <QDebug>
|
|
||||||
|
|
||||||
// recursive function to delete a dir with files
|
// recursive function to delete a dir with files
|
||||||
bool recRmdir( const QString &dirName )
|
bool recRmdir( const QString &dirName )
|
||||||
|
|
@ -157,3 +179,196 @@ QString installedVersion(QString mountpoint)
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QString getUserName(void)
|
||||||
|
{
|
||||||
|
#if defined(Q_OS_WIN32)
|
||||||
|
wchar_t userbuf[UNLEN];
|
||||||
|
DWORD usersize = UNLEN;
|
||||||
|
BOOL status;
|
||||||
|
|
||||||
|
status = GetUserNameW(userbuf, &usersize);
|
||||||
|
|
||||||
|
return QString::fromWCharArray(userbuf);
|
||||||
|
#endif
|
||||||
|
#if defined(Q_OS_LINUX) || defined(Q_OS_MACX)
|
||||||
|
return QString(getlogin());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(Q_OS_WIN32)
|
||||||
|
enum userlevel getUserPermissions(void)
|
||||||
|
{
|
||||||
|
LPUSER_INFO_1 buf;
|
||||||
|
NET_API_STATUS napistatus;
|
||||||
|
wchar_t userbuf[UNLEN];
|
||||||
|
DWORD usersize = UNLEN;
|
||||||
|
BOOL status;
|
||||||
|
enum userlevel result;
|
||||||
|
|
||||||
|
status = GetUserNameW(userbuf, &usersize);
|
||||||
|
if(!status)
|
||||||
|
return ERR;
|
||||||
|
|
||||||
|
napistatus = NetUserGetInfo(NULL, userbuf, (DWORD)1, (LPBYTE*)&buf);
|
||||||
|
|
||||||
|
switch(buf->usri1_priv) {
|
||||||
|
case USER_PRIV_GUEST:
|
||||||
|
result = GUEST;
|
||||||
|
break;
|
||||||
|
case USER_PRIV_USER:
|
||||||
|
result = USER;
|
||||||
|
break;
|
||||||
|
case USER_PRIV_ADMIN:
|
||||||
|
result = ADMIN;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
result = ERR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
NetApiBufferFree(buf);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString getUserPermissionsString(void)
|
||||||
|
{
|
||||||
|
QString result;
|
||||||
|
int perm = getUserPermissions();
|
||||||
|
switch(perm) {
|
||||||
|
case GUEST:
|
||||||
|
result = tr("Guest");
|
||||||
|
break;
|
||||||
|
case ADMIN:
|
||||||
|
result = tr("Admin");
|
||||||
|
break;
|
||||||
|
case USER:
|
||||||
|
result = tr("User");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
result = tr("Error");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QString getOsVersionString(void)
|
||||||
|
{
|
||||||
|
QString result;
|
||||||
|
#if defined(Q_OS_WIN32)
|
||||||
|
OSVERSIONINFO osvi;
|
||||||
|
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
|
||||||
|
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
||||||
|
GetVersionEx(&osvi);
|
||||||
|
|
||||||
|
result = QString("Windows version %1.%2, ").arg(osvi.dwMajorVersion).arg(osvi.dwMinorVersion);
|
||||||
|
result += QString("build %1 (%2)").arg(osvi.dwBuildNumber).arg(QString::fromWCharArray(osvi.szCSDVersion));
|
||||||
|
#endif
|
||||||
|
#if defined(Q_OS_LINUX) || defined(Q_OS_MACX)
|
||||||
|
struct utsname u;
|
||||||
|
int ret;
|
||||||
|
ret = uname(&u);
|
||||||
|
|
||||||
|
result = QString("CPU: %1<br/>System: %2<br/>Release: %3<br/>Version: %4")
|
||||||
|
.arg(u.machine).arg(u.sysname).arg(u.release).arg(u.version);
|
||||||
|
#endif
|
||||||
|
return result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @brief detect devices based on usb pid / vid.
|
||||||
|
* @return list with usb VID / PID values.
|
||||||
|
*/
|
||||||
|
QList<uint32_t> listUsbIds(void)
|
||||||
|
{
|
||||||
|
QList<uint32_t> usbids;
|
||||||
|
// usb pid detection
|
||||||
|
#if defined(Q_OS_LINUX) | defined(Q_OS_MACX)
|
||||||
|
usb_init();
|
||||||
|
usb_find_busses();
|
||||||
|
usb_find_devices();
|
||||||
|
struct usb_bus *b;
|
||||||
|
b = usb_busses;
|
||||||
|
|
||||||
|
while(b) {
|
||||||
|
qDebug() << "bus:" << b->dirname << b->devices;
|
||||||
|
if(b->devices) {
|
||||||
|
qDebug() << "devices present.";
|
||||||
|
struct usb_device *u;
|
||||||
|
u = b->devices;
|
||||||
|
while(u) {
|
||||||
|
uint32_t id;
|
||||||
|
id = u->descriptor.idVendor << 16 | u->descriptor.idProduct;
|
||||||
|
if(id) usbids.append(id);
|
||||||
|
u = u->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
b = b->next;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(Q_OS_WIN32)
|
||||||
|
HDEVINFO deviceInfo;
|
||||||
|
SP_DEVINFO_DATA infoData;
|
||||||
|
DWORD i;
|
||||||
|
|
||||||
|
// Iterate over all devices
|
||||||
|
// by doing it this way it's unneccessary to use GUIDs which might be not
|
||||||
|
// present in current MinGW. It also seemed to be more reliably than using
|
||||||
|
// a GUID.
|
||||||
|
// See KB259695 for an example.
|
||||||
|
deviceInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
|
||||||
|
|
||||||
|
infoData.cbSize = sizeof(SP_DEVINFO_DATA);
|
||||||
|
|
||||||
|
for(i = 0; SetupDiEnumDeviceInfo(deviceInfo, i, &infoData); i++) {
|
||||||
|
DWORD data;
|
||||||
|
LPTSTR buffer = NULL;
|
||||||
|
DWORD buffersize = 0;
|
||||||
|
|
||||||
|
// get device desriptor first
|
||||||
|
// for some reason not doing so results in bad things (tm)
|
||||||
|
while(!SetupDiGetDeviceRegistryProperty(deviceInfo, &infoData,
|
||||||
|
SPDRP_DEVICEDESC,&data, (PBYTE)buffer, buffersize, &buffersize)) {
|
||||||
|
if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
|
||||||
|
if(buffer) free(buffer);
|
||||||
|
// double buffer size to avoid problems as per KB888609
|
||||||
|
buffer = (LPTSTR)malloc(buffersize * 2);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// now get the hardware id, which contains PID and VID.
|
||||||
|
while(!SetupDiGetDeviceRegistryProperty(deviceInfo, &infoData,
|
||||||
|
SPDRP_HARDWAREID,&data, (PBYTE)buffer, buffersize, &buffersize)) {
|
||||||
|
if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
|
||||||
|
if(buffer) free(buffer);
|
||||||
|
// double buffer size to avoid problems as per KB888609
|
||||||
|
buffer = (LPTSTR)malloc(buffersize * 2);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int vid, pid, rev;
|
||||||
|
if(_stscanf(buffer, _TEXT("USB\\Vid_%x&Pid_%x&Rev_%x"), &vid, &pid, &rev) != 3) {
|
||||||
|
qDebug() << "Error getting USB ID -- possibly no USB device";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
uint32_t id;
|
||||||
|
id = vid << 16 | pid;
|
||||||
|
usbids.append(id);
|
||||||
|
qDebug("VID: %04x PID: %04x", vid, pid);
|
||||||
|
}
|
||||||
|
if(buffer) free(buffer);
|
||||||
|
}
|
||||||
|
SetupDiDestroyDeviceInfoList(deviceInfo);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
return usbids;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,15 @@
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
|
|
||||||
|
#if defined(Q_OS_WIN32)
|
||||||
|
enum userlevel { ERR, GUEST, USER, ADMIN };
|
||||||
|
enum userlevel getUserPermissions(void);
|
||||||
|
QString getUserPermissionsString(void);
|
||||||
|
#endif
|
||||||
|
QString getUserName(void);
|
||||||
|
QString getOsVersionString(void);
|
||||||
|
QList<uint32_t> listUsbIds(void);
|
||||||
|
|
||||||
bool recRmdir( const QString &dirName );
|
bool recRmdir( const QString &dirName );
|
||||||
QString resolvePathCase(QString path);
|
QString resolvePathCase(QString path);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue