summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rbutil/rbutilqt/autodetection.cpp140
-rw-r--r--rbutil/rbutilqt/icons/view-refresh.pngbin0 -> 912 bytes
-rw-r--r--rbutil/rbutilqt/rbutilqt.cpp9
-rw-r--r--rbutil/rbutilqt/rbutilqt.h1
-rw-r--r--rbutil/rbutilqt/rbutilqt.pro11
-rw-r--r--rbutil/rbutilqt/rbutilqt.qrc1
-rw-r--r--rbutil/rbutilqt/rbutilqtfrm.ui14
-rw-r--r--rbutil/rbutilqt/sysinfo.cpp54
-rw-r--r--rbutil/rbutilqt/sysinfo.h42
-rw-r--r--rbutil/rbutilqt/sysinfofrm.ui66
-rw-r--r--rbutil/rbutilqt/utils.cpp221
-rw-r--r--rbutil/rbutilqt/utils.h9
12 files changed, 435 insertions, 133 deletions
diff --git a/rbutil/rbutilqt/autodetection.cpp b/rbutil/rbutilqt/autodetection.cpp
index 3684d55908..f257f5c0c9 100644
--- a/rbutil/rbutilqt/autodetection.cpp
+++ b/rbutil/rbutilqt/autodetection.cpp
@@ -40,6 +40,7 @@
40#include <windows.h> 40#include <windows.h>
41#include <setupapi.h> 41#include <setupapi.h>
42#endif 42#endif
43#include "utils.h"
43 44
44Autodetection::Autodetection(QObject* parent): QObject(parent) 45Autodetection::Autodetection(QObject* parent): QObject(parent)
45{ 46{
@@ -265,132 +266,27 @@ bool Autodetection::detectUsb()
265 QMap<int, QString> usbincompat = settings->usbIdIncompatMap(); 266 QMap<int, QString> usbincompat = settings->usbIdIncompatMap();
266 267
267 // usb pid detection 268 // usb pid detection
268#if defined(Q_OS_LINUX) | defined(Q_OS_MACX) 269 QList<uint32_t> attached;
269 usb_init(); 270 attached = listUsbIds();
270 usb_find_busses(); 271
271 usb_find_devices(); 272 int i = attached.size();
272 struct usb_bus *b; 273 while(i--) {
273 b = usb_get_busses(); 274 if(usbids.contains(attached.at(i))) {
274 275 m_device = usbids.value(attached.at(i));
275 while(b) { 276 qDebug() << "[USB] detected supported player" << m_device;
276 qDebug() << "bus:" << b->dirname << b->devices; 277 return true;
277 if(b->devices) {
278 qDebug() << "devices present.";
279 struct usb_device *u;
280 u = b->devices;
281 while(u) {
282 uint32_t id;
283 id = u->descriptor.idVendor << 16 | u->descriptor.idProduct;
284 m_usbconid.append(id);
285 qDebug("%x", id);
286
287 if(usbids.contains(id)) {
288 m_device = usbids.value(id);
289 return true;
290 }
291 if(usberror.contains(id)) {
292 m_errdev = usberror.value(id);
293 // we detected something, so return true
294 qDebug() << "detected device with problems via usb!";
295 return true;
296 }
297 if(usbincompat.contains(id)) {
298 m_incompat = usbincompat.value(id);
299 qDebug() << "detected incompatible player variant";
300 return true;
301 }
302 u = u->next;
303 }
304 } 278 }
305 b = b->next; 279 if(usberror.contains(attached.at(i))) {
306 } 280 m_errdev = usberror.value(attached.at(i));
307#endif 281 qDebug() << "[USB] detected problem with player" << m_errdev;
308 282 return true;
309#if defined(Q_OS_WIN32)
310 HDEVINFO deviceInfo;
311 SP_DEVINFO_DATA infoData;
312 DWORD i;
313
314 // Iterate over all devices
315 // by doing it this way it's unneccessary to use GUIDs which might be not
316 // present in current MinGW. It also seemed to be more reliably than using
317 // a GUID.
318 // See KB259695 for an example.
319 deviceInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
320
321 infoData.cbSize = sizeof(SP_DEVINFO_DATA);
322
323 for(i = 0; SetupDiEnumDeviceInfo(deviceInfo, i, &infoData); i++) {
324 DWORD data;
325 LPTSTR buffer = NULL;
326 DWORD buffersize = 0;
327
328 // get device desriptor first
329 // for some reason not doing so results in bad things (tm)
330 while(!SetupDiGetDeviceRegistryProperty(deviceInfo, &infoData,
331 SPDRP_DEVICEDESC,&data, (PBYTE)buffer, buffersize, &buffersize)) {
332 if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
333 if(buffer) free(buffer);
334 // double buffer size to avoid problems as per KB888609
335 buffer = (LPTSTR)malloc(buffersize * 2);
336 }
337 else {
338 break;
339 }
340 } 283 }
341 284 if(usbincompat.contains(attached.at(i))) {
342 // now get the hardware id, which contains PID and VID. 285 m_incompat = usbincompat.value(attached.at(i));
343 while(!SetupDiGetDeviceRegistryProperty(deviceInfo, &infoData, 286 qDebug() << "[USB] detected incompatible player" << m_incompat;
344 SPDRP_HARDWAREID,&data, (PBYTE)buffer, buffersize, &buffersize)) { 287 return true;
345 if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
346 if(buffer) free(buffer);
347 // double buffer size to avoid problems as per KB888609
348 buffer = (LPTSTR)malloc(buffersize * 2);
349 }
350 else {
351 break;
352 }
353 }
354
355 unsigned int vid, pid, rev;
356 if(_stscanf(buffer, _TEXT("USB\\Vid_%x&Pid_%x&Rev_%x"), &vid, &pid, &rev) != 3) {
357 qDebug() << "Error getting USB ID -- possibly no USB device";
358 } 288 }
359 else {
360 uint32_t id;
361 id = vid << 16 | pid;
362 m_usbconid.append(id);
363 qDebug("VID: %04x PID: %04x", vid, pid);
364 if(usbids.contains(id)) {
365 m_device = usbids.value(id);
366 if(buffer) free(buffer);
367 SetupDiDestroyDeviceInfoList(deviceInfo);
368 qDebug() << "detectUsb: Got" << m_device;
369 return true;
370 }
371 if(usberror.contains(id)) {
372 m_errdev = usberror.value(id);
373 // we detected something, so return true
374 if(buffer) free(buffer);
375 SetupDiDestroyDeviceInfoList(deviceInfo);
376 qDebug() << "detectUsb: Got" << m_device;
377 qDebug() << "detected device with problems via usb!";
378 return true;
379 }
380 if(usbincompat.contains(id)) {
381 m_incompat = usbincompat.value(id);
382 // we detected an incompatible player variant
383 if(buffer) free(buffer);
384 SetupDiDestroyDeviceInfoList(deviceInfo);
385 qDebug() << "detectUsb: detected incompatible variant";
386 return true;
387 }
388 }
389 if(buffer) free(buffer);
390 } 289 }
391 SetupDiDestroyDeviceInfoList(deviceInfo);
392
393#endif
394 return false; 290 return false;
395} 291}
396 292
diff --git a/rbutil/rbutilqt/icons/view-refresh.png b/rbutil/rbutilqt/icons/view-refresh.png
new file mode 100644
index 0000000000..3fd71d6e59
--- /dev/null
+++ b/rbutil/rbutilqt/icons/view-refresh.png
Binary files differ
diff --git a/rbutil/rbutilqt/rbutilqt.cpp b/rbutil/rbutilqt/rbutilqt.cpp
index c1523cb92e..a669949aa9 100644
--- a/rbutil/rbutilqt/rbutilqt.cpp
+++ b/rbutil/rbutilqt/rbutilqt.cpp
@@ -34,6 +34,8 @@
34#include "browseof.h" 34#include "browseof.h"
35#include "utils.h" 35#include "utils.h"
36#include "rbzip.h" 36#include "rbzip.h"
37#include "sysinfo.h"
38
37 39
38#if defined(Q_OS_LINUX) 40#if defined(Q_OS_LINUX)
39#include <stdio.h> 41#include <stdio.h>
@@ -101,6 +103,7 @@ RbUtilQt::RbUtilQt(QWidget *parent) : QMainWindow(parent)
101 connect(ui.actionCreate_Talk_Files, SIGNAL(triggered()), this, SLOT(createTalkFiles())); 103 connect(ui.actionCreate_Talk_Files, SIGNAL(triggered()), this, SLOT(createTalkFiles()));
102 connect(ui.actionRemove_bootloader, SIGNAL(triggered()), this, SLOT(uninstallBootloader())); 104 connect(ui.actionRemove_bootloader, SIGNAL(triggered()), this, SLOT(uninstallBootloader()));
103 connect(ui.actionUninstall_Rockbox, SIGNAL(triggered()), this, SLOT(uninstall())); 105 connect(ui.actionUninstall_Rockbox, SIGNAL(triggered()), this, SLOT(uninstall()));
106 connect(ui.action_System_Info, SIGNAL(triggered()), this, SLOT(sysinfo()));
104 107
105#if !defined(STATIC) 108#if !defined(STATIC)
106 ui.actionInstall_Rockbox_Utility_on_player->setEnabled(false); 109 ui.actionInstall_Rockbox_Utility_on_player->setEnabled(false);
@@ -115,6 +118,12 @@ RbUtilQt::RbUtilQt(QWidget *parent) : QMainWindow(parent)
115} 118}
116 119
117 120
121void RbUtilQt::sysinfo(void)
122{
123 Sysinfo *info = new Sysinfo(this);
124 info->show();
125}
126
118void RbUtilQt::updateTabs(int count) 127void RbUtilQt::updateTabs(int count)
119{ 128{
120 switch(count) { 129 switch(count) {
diff --git a/rbutil/rbutilqt/rbutilqt.h b/rbutil/rbutilqt/rbutilqt.h
index 8de5ea0113..3c6cbd0784 100644
--- a/rbutil/rbutilqt/rbutilqt.h
+++ b/rbutil/rbutilqt/rbutilqt.h
@@ -66,6 +66,7 @@ class RbUtilQt : public QMainWindow
66 private slots: 66 private slots:
67 void about(void); 67 void about(void);
68 void help(void); 68 void help(void);
69 void sysinfo(void);
69 void configDialog(void); 70 void configDialog(void);
70 void updateDevice(void); 71 void updateDevice(void);
71 void updateSettings(void); 72 void updateSettings(void);
diff --git a/rbutil/rbutilqt/rbutilqt.pro b/rbutil/rbutilqt/rbutilqt.pro
index a10d06591e..9e9e8c4976 100644
--- a/rbutil/rbutilqt/rbutilqt.pro
+++ b/rbutil/rbutilqt/rbutilqt.pro
@@ -62,7 +62,8 @@ SOURCES += rbutilqt.cpp \
62 createvoicewindow.cpp \ 62 createvoicewindow.cpp \
63 rbsettings.cpp \ 63 rbsettings.cpp \
64 rbunzip.cpp \ 64 rbunzip.cpp \
65 rbzip.cpp 65 rbzip.cpp \
66 sysinfo.cpp
66 67
67HEADERS += rbutilqt.h \ 68HEADERS += rbutilqt.h \
68 install.h \ 69 install.h \
@@ -109,7 +110,8 @@ HEADERS += rbutilqt.h \
109 createvoicewindow.h \ 110 createvoicewindow.h \
110 rbsettings.h \ 111 rbsettings.h \
111 rbunzip.h \ 112 rbunzip.h \
112 rbzip.h 113 rbzip.h \
114 sysinfo.h
113 115
114# Needed by QT on Win 116# Needed by QT on Win
115INCLUDEPATH = . irivertools zip zlib ../ipodpatcher ../sansapatcher ../../tools/rbspeex ../../tools 117INCLUDEPATH = . irivertools zip zlib ../ipodpatcher ../sansapatcher ../../tools/rbspeex ../../tools
@@ -145,7 +147,8 @@ FORMS += rbutilqtfrm.ui \
145 encexescfgfrm.ui \ 147 encexescfgfrm.ui \
146 ttsexescfgfrm.ui \ 148 ttsexescfgfrm.ui \
147 sapicfgfrm.ui \ 149 sapicfgfrm.ui \
148 createvoicefrm.ui 150 createvoicefrm.ui \
151 sysinfofrm.ui
149 152
150RESOURCES += rbutilqt.qrc 153RESOURCES += rbutilqt.qrc
151win32 { 154win32 {
@@ -164,7 +167,7 @@ win32 {
164 SOURCES += ../ipodpatcher/ipodio-win32.c 167 SOURCES += ../ipodpatcher/ipodio-win32.c
165 SOURCES += ../sansapatcher/sansaio-win32.c 168 SOURCES += ../sansapatcher/sansaio-win32.c
166 RC_FILE = rbutilqt.rc 169 RC_FILE = rbutilqt.rc
167 LIBS += -lsetupapi 170 LIBS += -lsetupapi -lnetapi32
168} 171}
169 172
170unix { 173unix {
diff --git a/rbutil/rbutilqt/rbutilqt.qrc b/rbutil/rbutilqt/rbutilqt.qrc
index 694836c781..62a804180c 100644
--- a/rbutil/rbutilqt/rbutilqt.qrc
+++ b/rbutil/rbutilqt/rbutilqt.qrc
@@ -31,6 +31,7 @@
31 <file>icons/talkfile_btn.png</file> 31 <file>icons/talkfile_btn.png</file>
32 <file>icons/themes_btn.png</file> 32 <file>icons/themes_btn.png</file>
33 <file>icons/user-trash-full.png</file> 33 <file>icons/user-trash-full.png</file>
34 <file>icons/view-refresh.png</file>
34 <file>icons/wizard.xpm</file> 35 <file>icons/wizard.xpm</file>
35 </qresource> 36 </qresource>
36 <qresource prefix="/ini" > 37 <qresource prefix="/ini" >
diff --git a/rbutil/rbutilqt/rbutilqtfrm.ui b/rbutil/rbutilqt/rbutilqtfrm.ui
index 90018a3301..804856414f 100644
--- a/rbutil/rbutilqt/rbutilqtfrm.ui
+++ b/rbutil/rbutilqt/rbutilqtfrm.ui
@@ -94,9 +94,9 @@
94 <item row="0" column="1" > 94 <item row="0" column="1" >
95 <widget class="QLabel" name="labelDevice" > 95 <widget class="QLabel" name="labelDevice" >
96 <property name="text" > 96 <property name="text" >
97 <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css"> 97 <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">&#xd;
98p, li { white-space: pre-wrap; } 98p, li { white-space: pre-wrap; }&#xd;
99&lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> 99&lt;/style>&lt;/head>&lt;body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">&#xd;
100&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-weight:600;">none&lt;/span> at &lt;span style=" font-weight:600;">unknown&lt;/span>&lt;/p>&lt;/body>&lt;/html></string> 100&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-weight:600;">none&lt;/span> at &lt;span style=" font-weight:600;">unknown&lt;/span>&lt;/p>&lt;/body>&lt;/html></string>
101 </property> 101 </property>
102 </widget> 102 </widget>
@@ -539,7 +539,7 @@ p, li { white-space: pre-wrap; }
539 <item row="1" column="1" > 539 <item row="1" column="1" >
540 <widget class="QLabel" name="labelCreateVoice" > 540 <widget class="QLabel" name="labelCreateVoice" >
541 <property name="text" > 541 <property name="text" >
542 <string>&lt;b>Create Voice file&lt;/b>&lt;br/>Voice files are needed to make Rockbox speak the user interface. Speaking is enabled by default, so 542 <string>&lt;b>Create Voice file&lt;/b>&lt;br/>Voice files are needed to make Rockbox speak the user interface. Speaking is enabled by default, so&#xd;
543 if you installed the voice file Rockbox will speak.</string> 543 if you installed the voice file Rockbox will speak.</string>
544 </property> 544 </property>
545 <property name="wordWrap" > 545 <property name="wordWrap" >
@@ -806,6 +806,7 @@ p, li { white-space: pre-wrap; }
806 <addaction name="action_About" /> 806 <addaction name="action_About" />
807 <addaction name="actionAbout_Qt" /> 807 <addaction name="actionAbout_Qt" />
808 <addaction name="separator" /> 808 <addaction name="separator" />
809 <addaction name="action_System_Info" />
809 <addaction name="action_Help" /> 810 <addaction name="action_Help" />
810 </widget> 811 </widget>
811 <widget class="QMenu" name="menuA_ctions" > 812 <widget class="QMenu" name="menuA_ctions" >
@@ -1022,6 +1023,11 @@ p, li { white-space: pre-wrap; }
1022 <string>Create Voice File</string> 1023 <string>Create Voice File</string>
1023 </property> 1024 </property>
1024 </action> 1025 </action>
1026 <action name="action_System_Info" >
1027 <property name="text" >
1028 <string>&amp;System Info</string>
1029 </property>
1030 </action>
1025 </widget> 1031 </widget>
1026 <tabstops> 1032 <tabstops>
1027 <tabstop>tabWidget</tabstop> 1033 <tabstop>tabWidget</tabstop>
diff --git a/rbutil/rbutilqt/sysinfo.cpp b/rbutil/rbutilqt/sysinfo.cpp
new file mode 100644
index 0000000000..413494c679
--- /dev/null
+++ b/rbutil/rbutilqt/sysinfo.cpp
@@ -0,0 +1,54 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2007 by Dominik Riebeling
10 * $Id$
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19
20#include <QtGui>
21#include "sysinfo.h"
22#include "ui_sysinfofrm.h"
23#include "utils.h"
24
25
26Sysinfo::Sysinfo(QWidget *parent) : QDialog(parent)
27{
28 ui.setupUi(this);
29 this->setModal(true);
30
31 updateSysinfo();
32 connect(ui.buttonOk, SIGNAL(clicked()), this, SLOT(close()));
33 connect(ui.buttonRefresh, SIGNAL(clicked()), this, SLOT(updateSysinfo()));
34}
35
36
37void Sysinfo::updateSysinfo(void)
38{
39 QString info;
40 info += tr("<b>OS</b><br/>") + getOsVersionString() + "<hr/>";
41 info += tr("<b>Username:</b><br/>%1<hr/>").arg(getUserName());
42#if defined(Q_OS_WIN32)
43 info += tr("<b>Permissions:</b><br/>%1<hr/>").arg(getUserPermissionsString());
44#endif
45 info += tr("<b>Attached USB devices:</b><br/>");
46 QList<uint32_t> usbids = listUsbIds();
47 for(int i = 0; i < usbids.size(); i++)
48 info += tr("VID: %1 PID: %2<br/>")
49 .arg((usbids.at(i)&0xffff0000)>>16, 4, 16, QChar('0'))
50 .arg(usbids.at(i)&0xffff, 4, 16, QChar('0'));
51
52 ui.textBrowser->setHtml(info);
53}
54
diff --git a/rbutil/rbutilqt/sysinfo.h b/rbutil/rbutilqt/sysinfo.h
new file mode 100644
index 0000000000..a3dbed9941
--- /dev/null
+++ b/rbutil/rbutilqt/sysinfo.h
@@ -0,0 +1,42 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2007 by Dominik Riebeling
10 * $Id$
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19
20#ifndef SYSINFO_H
21#define SYSINFO_H
22
23#include <QtGui>
24#include "ui_sysinfofrm.h"
25
26class Sysinfo : public QDialog
27{
28 Q_OBJECT
29
30 public:
31 Sysinfo(QWidget *parent = 0);
32
33 private:
34 Ui::SysinfoFrm ui;
35
36 private slots:
37 void updateSysinfo(void);
38
39};
40
41#endif
42
diff --git a/rbutil/rbutilqt/sysinfofrm.ui b/rbutil/rbutilqt/sysinfofrm.ui
new file mode 100644
index 0000000000..b2340a6310
--- /dev/null
+++ b/rbutil/rbutilqt/sysinfofrm.ui
@@ -0,0 +1,66 @@
1<ui version="4.0" >
2 <class>SysinfoFrm</class>
3 <widget class="QWidget" name="SysinfoFrm" >
4 <property name="geometry" >
5 <rect>
6 <x>0</x>
7 <y>0</y>
8 <width>400</width>
9 <height>300</height>
10 </rect>
11 </property>
12 <property name="windowTitle" >
13 <string>System Info</string>
14 </property>
15 <layout class="QGridLayout" >
16 <item row="0" column="0" colspan="3" >
17 <widget class="QTextBrowser" name="textBrowser" />
18 </item>
19 <item row="1" column="0" >
20 <widget class="QPushButton" name="buttonRefresh" >
21 <property name="text" >
22 <string>&amp;Refresh</string>
23 </property>
24 <property name="icon" >
25 <iconset resource="rbutilqt.qrc" >:/icons/view-refresh.png</iconset>
26 </property>
27 </widget>
28 </item>
29 <item row="1" column="1" >
30 <spacer>
31 <property name="orientation" >
32 <enum>Qt::Horizontal</enum>
33 </property>
34 <property name="sizeHint" >
35 <size>
36 <width>40</width>
37 <height>20</height>
38 </size>
39 </property>
40 </spacer>
41 </item>
42 <item row="1" column="2" >
43 <widget class="QPushButton" name="buttonOk" >
44 <property name="text" >
45 <string>&amp;OK</string>
46 </property>
47 <property name="icon" >
48 <iconset resource="rbutilqt.qrc" >:/icons/go-next.png</iconset>
49 </property>
50 <property name="default" >
51 <bool>true</bool>
52 </property>
53 </widget>
54 </item>
55 </layout>
56 </widget>
57 <tabstops>
58 <tabstop>buttonOk</tabstop>
59 <tabstop>buttonRefresh</tabstop>
60 <tabstop>textBrowser</tabstop>
61 </tabstops>
62 <resources>
63 <include location="rbutilqt.qrc" />
64 </resources>
65 <connections/>
66</ui>
diff --git a/rbutil/rbutilqt/utils.cpp b/rbutil/rbutilqt/utils.cpp
index a552b5cd5e..c95c5cf0eb 100644
--- a/rbutil/rbutilqt/utils.cpp
+++ b/rbutil/rbutilqt/utils.cpp
@@ -19,9 +19,10 @@
19 19
20#include "utils.h" 20#include "utils.h"
21 21
22#include <QtCore>
23#include <QDebug>
22#include <cstdlib> 24#include <cstdlib>
23 25#include <stdio.h>
24#include <QDir>
25 26
26#if defined(Q_OS_WIN32) 27#if defined(Q_OS_WIN32)
27#if defined(UNICODE) 28#if defined(UNICODE)
@@ -29,8 +30,29 @@
29#endif 30#endif
30#include <windows.h> 31#include <windows.h>
31#include <tchar.h> 32#include <tchar.h>
33#include <lm.h>
34#endif
35#if defined(Q_OS_LINUX) || defined(Q_OS_MACX)
36#include <usb.h>
37#include <sys/utsname.h>
38#include <unistd.h>
39#endif
40#if defined(Q_OS_LINUX)
41#include <mntent.h>
42#endif
43#if defined(Q_OS_MACX)
44#include <sys/param.h>
45#include <sys/ucred.h>
46#include <sys/mount.h>
47#endif
48#if defined(Q_OS_WIN32)
49#if defined(UNICODE)
50#define _UNICODE
51#endif
52#include <tchar.h>
53#include <windows.h>
54#include <setupapi.h>
32#endif 55#endif
33#include <QDebug>
34 56
35// recursive function to delete a dir with files 57// recursive function to delete a dir with files
36bool recRmdir( const QString &dirName ) 58bool recRmdir( const QString &dirName )
@@ -157,3 +179,196 @@ QString installedVersion(QString mountpoint)
157 return ""; 179 return "";
158} 180}
159 181
182
183QString getUserName(void)
184{
185#if defined(Q_OS_WIN32)
186 wchar_t userbuf[UNLEN];
187 DWORD usersize = UNLEN;
188 BOOL status;
189
190 status = GetUserNameW(userbuf, &usersize);
191
192 return QString::fromWCharArray(userbuf);
193#endif
194#if defined(Q_OS_LINUX) || defined(Q_OS_MACX)
195 return QString(getlogin());
196#endif
197}
198
199
200#if defined(Q_OS_WIN32)
201enum userlevel getUserPermissions(void)
202{
203 LPUSER_INFO_1 buf;
204 NET_API_STATUS napistatus;
205 wchar_t userbuf[UNLEN];
206 DWORD usersize = UNLEN;
207 BOOL status;
208 enum userlevel result;
209
210 status = GetUserNameW(userbuf, &usersize);
211 if(!status)
212 return ERR;
213
214 napistatus = NetUserGetInfo(NULL, userbuf, (DWORD)1, (LPBYTE*)&buf);
215
216 switch(buf->usri1_priv) {
217 case USER_PRIV_GUEST:
218 result = GUEST;
219 break;
220 case USER_PRIV_USER:
221 result = USER;
222 break;
223 case USER_PRIV_ADMIN:
224 result = ADMIN;
225 break;
226 default:
227 result = ERR;
228 break;
229 }
230 NetApiBufferFree(buf);
231
232 return result;
233}
234
235QString getUserPermissionsString(void)
236{
237 QString result;
238 int perm = getUserPermissions();
239 switch(perm) {
240 case GUEST:
241 result = tr("Guest");
242 break;
243 case ADMIN:
244 result = tr("Admin");
245 break;
246 case USER:
247 result = tr("User");
248 break;
249 default:
250 result = tr("Error");
251 break;
252 }
253 return result;
254}
255#endif
256
257QString getOsVersionString(void)
258{
259 QString result;
260#if defined(Q_OS_WIN32)
261 OSVERSIONINFO osvi;
262 ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
263 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
264 GetVersionEx(&osvi);
265
266 result = QString("Windows version %1.%2, ").arg(osvi.dwMajorVersion).arg(osvi.dwMinorVersion);
267 result += QString("build %1 (%2)").arg(osvi.dwBuildNumber).arg(QString::fromWCharArray(osvi.szCSDVersion));
268#endif
269#if defined(Q_OS_LINUX) || defined(Q_OS_MACX)
270 struct utsname u;
271 int ret;
272 ret = uname(&u);
273
274 result = QString("CPU: %1<br/>System: %2<br/>Release: %3<br/>Version: %4")
275 .arg(u.machine).arg(u.sysname).arg(u.release).arg(u.version);
276#endif
277 return result;
278
279}
280
281/** @brief detect devices based on usb pid / vid.
282 * @return list with usb VID / PID values.
283 */
284QList<uint32_t> listUsbIds(void)
285{
286 QList<uint32_t> usbids;
287 // usb pid detection
288#if defined(Q_OS_LINUX) | defined(Q_OS_MACX)
289 usb_init();
290 usb_find_busses();
291 usb_find_devices();
292 struct usb_bus *b;
293 b = usb_busses;
294
295 while(b) {
296 qDebug() << "bus:" << b->dirname << b->devices;
297 if(b->devices) {
298 qDebug() << "devices present.";
299 struct usb_device *u;
300 u = b->devices;
301 while(u) {
302 uint32_t id;
303 id = u->descriptor.idVendor << 16 | u->descriptor.idProduct;
304 if(id) usbids.append(id);
305 u = u->next;
306 }
307 }
308 b = b->next;
309 }
310#endif
311
312#if defined(Q_OS_WIN32)
313 HDEVINFO deviceInfo;
314 SP_DEVINFO_DATA infoData;
315 DWORD i;
316
317 // Iterate over all devices
318 // by doing it this way it's unneccessary to use GUIDs which might be not
319 // present in current MinGW. It also seemed to be more reliably than using
320 // a GUID.
321 // See KB259695 for an example.
322 deviceInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
323
324 infoData.cbSize = sizeof(SP_DEVINFO_DATA);
325
326 for(i = 0; SetupDiEnumDeviceInfo(deviceInfo, i, &infoData); i++) {
327 DWORD data;
328 LPTSTR buffer = NULL;
329 DWORD buffersize = 0;
330
331 // get device desriptor first
332 // for some reason not doing so results in bad things (tm)
333 while(!SetupDiGetDeviceRegistryProperty(deviceInfo, &infoData,
334 SPDRP_DEVICEDESC,&data, (PBYTE)buffer, buffersize, &buffersize)) {
335 if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
336 if(buffer) free(buffer);
337 // double buffer size to avoid problems as per KB888609
338 buffer = (LPTSTR)malloc(buffersize * 2);
339 }
340 else {
341 break;
342 }
343 }
344
345 // now get the hardware id, which contains PID and VID.
346 while(!SetupDiGetDeviceRegistryProperty(deviceInfo, &infoData,
347 SPDRP_HARDWAREID,&data, (PBYTE)buffer, buffersize, &buffersize)) {
348 if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
349 if(buffer) free(buffer);
350 // double buffer size to avoid problems as per KB888609
351 buffer = (LPTSTR)malloc(buffersize * 2);
352 }
353 else {
354 break;
355 }
356 }
357
358 unsigned int vid, pid, rev;
359 if(_stscanf(buffer, _TEXT("USB\\Vid_%x&Pid_%x&Rev_%x"), &vid, &pid, &rev) != 3) {
360 qDebug() << "Error getting USB ID -- possibly no USB device";
361 }
362 else {
363 uint32_t id;
364 id = vid << 16 | pid;
365 usbids.append(id);
366 qDebug("VID: %04x PID: %04x", vid, pid);
367 }
368 if(buffer) free(buffer);
369 }
370 SetupDiDestroyDeviceInfoList(deviceInfo);
371
372#endif
373 return usbids;
374}
diff --git a/rbutil/rbutilqt/utils.h b/rbutil/rbutilqt/utils.h
index 9b0b026921..a7be093520 100644
--- a/rbutil/rbutilqt/utils.h
+++ b/rbutil/rbutilqt/utils.h
@@ -24,6 +24,15 @@
24#include <QString> 24#include <QString>
25#include <QUrl> 25#include <QUrl>
26 26
27#if defined(Q_OS_WIN32)
28enum userlevel { ERR, GUEST, USER, ADMIN };
29enum userlevel getUserPermissions(void);
30QString getUserPermissionsString(void);
31#endif
32QString getUserName(void);
33QString getOsVersionString(void);
34QList<uint32_t> listUsbIds(void);
35
27bool recRmdir( const QString &dirName ); 36bool recRmdir( const QString &dirName );
28QString resolvePathCase(QString path); 37QString resolvePathCase(QString path);
29 38