summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--libopie2/opiecore/device/odevice_simpad.cpp34
1 files changed, 16 insertions, 18 deletions
diff --git a/libopie2/opiecore/device/odevice_simpad.cpp b/libopie2/opiecore/device/odevice_simpad.cpp
index 9fde7f9..2e54216 100644
--- a/libopie2/opiecore/device/odevice_simpad.cpp
+++ b/libopie2/opiecore/device/odevice_simpad.cpp
@@ -212,53 +212,51 @@ void SIMpad::initButtons()
* many more things.
* To not lose the current setting we read the current
* cs3 setting and toggle the necessary bits and then
* write it.
*/
static bool setCS3Bit( bool bitset, int bit ) {
- int cs3_fd = ::open( SIMPAD_BOARDCONTROL, O_RDONLY );
-
- if ( cs3_fd < 0 )
+ QFile file( SIMPAD_BOARDCONTROL );
+ if ( !file.open( IO_ReadOnly ) )
return false;
- static char line[32];
- int val = 0;
+ unsigned int val = 0;
bool ok = false;
+ QTextStream stream( &file );
/*
- * try to read and parse the Chipselect3 status
- * be paranoid and make sure line[31] is null
- * terminated
+ * Use QFile and QTextStream for parsing to be more
+ * robust
*/
- while( !ok && ::read(cs3_fd, &line, sizeof(line)) > 0 ) {
- line[31] = '\0';
- if (::sscanf(line, "Chipselect3 : %x", &val ))
+ while ( !stream.atEnd() ) {
+ QString line = stream.readLine();
+ if ( line.startsWith( "Chipselect3 : " ) ) {
+ val = line.mid( 15 ).toUInt( 0, 16 );
ok = true;
+ break;
+ }
}
- ::close(cs3_fd);
-
- /*
- * we were not able to find the current value
- * and as a result we won't set it
- */
if ( !ok )
return false;
+ file.close();
+
/*
* change the value
*/
val = bitset ? (val | bit) : (val & ~bit);
/*
* write it back
*/
- cs3_fd = ::open( SIMPAD_BOARDCONTROL, O_WRONLY );
+ int cs3_fd = ::open( SIMPAD_BOARDCONTROL, O_WRONLY );
if ( cs3_fd < 0 )
return false;
+ char line[32];
::snprintf(line, sizeof(line), "0x%04x\n", val);
::write(cs3_fd, line, strlen(line));
::close(cs3_fd);
return true;
}