24 files changed, 139 insertions, 137 deletions
diff --git a/noncore/settings/networksettings2/bluetooth/bluetoothRFCOMMrun.cpp b/noncore/settings/networksettings2/bluetooth/bluetoothRFCOMMrun.cpp index ef6878a..3df7f5c 100644 --- a/noncore/settings/networksettings2/bluetooth/bluetoothRFCOMMrun.cpp +++ b/noncore/settings/networksettings2/bluetooth/bluetoothRFCOMMrun.cpp | |||
@@ -1,164 +1,164 @@ | |||
1 | #include <qapplication.h> | 1 | #include <qapplication.h> |
2 | #include <resources.h> | 2 | #include <resources.h> |
3 | #include <OTDevice.h> | 3 | #include <OTDevice.h> |
4 | #include <OTGateway.h> | 4 | #include <OTGateway.h> |
5 | #include "bluetoothRFCOMMrun.h" | 5 | #include "bluetoothRFCOMMrun.h" |
6 | 6 | ||
7 | using Opietooth2::OTGateway; | 7 | using Opietooth2::OTGateway; |
8 | using Opietooth2::OTDevice; | 8 | using Opietooth2::OTDevice; |
9 | using Opietooth2::OTDeviceAddress; | 9 | using Opietooth2::OTDeviceAddress; |
10 | 10 | ||
11 | BluetoothRFCOMMRun::~BluetoothRFCOMMRun( void ) { | 11 | BluetoothRFCOMMRun::~BluetoothRFCOMMRun( void ) { |
12 | if( OT ) { | 12 | if( OT ) { |
13 | OTGateway::releaseOTGateway(); | 13 | OTGateway::releaseOTGateway(); |
14 | } | 14 | } |
15 | } | 15 | } |
16 | 16 | ||
17 | State_t BluetoothRFCOMMRun::detectState( void ) { | 17 | State_t BluetoothRFCOMMRun::detectState( void ) { |
18 | 18 | ||
19 | if( ! OT ) { | 19 | if( ! OT ) { |
20 | OT = OTGateway::getOTGateway(); | 20 | OT = OTGateway::getOTGateway(); |
21 | } | 21 | } |
22 | 22 | ||
23 | if( deviceNrOfConnection() >= 0 ) { | 23 | if( deviceNrOfConnection() >= 0 ) { |
24 | return Available; | 24 | return Available; |
25 | } | 25 | } |
26 | 26 | ||
27 | owarn << "Bluetooth " | 27 | odebug << "Bluetooth " |
28 | << OT->isEnabled() | 28 | << OT->isEnabled() |
29 | << oendl; | 29 | << oendl; |
30 | 30 | ||
31 | return ( OT->isEnabled() ) ? Off : Unavailable; | 31 | return ( OT->isEnabled() ) ? Off : Unavailable; |
32 | } | 32 | } |
33 | 33 | ||
34 | QString BluetoothRFCOMMRun::setMyState( NodeCollection *, | 34 | QString BluetoothRFCOMMRun::setMyState( NodeCollection *, |
35 | Action_t A, | 35 | Action_t A, |
36 | bool ) { | 36 | bool ) { |
37 | 37 | ||
38 | if( OT ) { | 38 | if( OT ) { |
39 | OTGateway::getOTGateway(); | 39 | OTGateway::getOTGateway(); |
40 | } | 40 | } |
41 | 41 | ||
42 | if( A == Activate ) { | 42 | if( A == Activate ) { |
43 | // from OFF to Available | 43 | // from OFF to Available |
44 | RFCOMMChannel * Ch = getChannel( ); | 44 | RFCOMMChannel * Ch = getChannel( ); |
45 | System & Sys = NSResources->system(); | 45 | System & Sys = NSResources->system(); |
46 | 46 | ||
47 | if( Ch ) { | 47 | if( Ch ) { |
48 | // connect to this peer | 48 | // connect to this peer |
49 | DeviceNr = OT->getFreeRFCommDevice(); | 49 | DeviceNr = OT->getFreeRFCommDevice(); |
50 | QStringList S; | 50 | QStringList S; |
51 | 51 | ||
52 | S << "rfcomm" | 52 | S << "rfcomm" |
53 | << "bind" | 53 | << "bind" |
54 | << QString().setNum( DeviceNr ) | 54 | << QString().setNum( DeviceNr ) |
55 | << Ch->BDAddress | 55 | << Ch->BDAddress |
56 | << QString().setNum( Ch->Channel ); | 56 | << QString().setNum( Ch->Channel ); |
57 | 57 | ||
58 | if( Sys.runAsRoot( S ) ) { | 58 | if( Sys.runAsRoot( S ) ) { |
59 | return QString( "Error starting %1").arg(S.join(" ")); | 59 | return QString( "Error starting %1").arg(S.join(" ")); |
60 | } | 60 | } |
61 | 61 | ||
62 | // here rfcomm should be running -> we will detect state later | 62 | // here rfcomm should be running -> we will detect state later |
63 | return QString(); | 63 | return QString(); |
64 | } else { | 64 | } else { |
65 | Log(( "No channel selected -> cancel\n" )); | 65 | Log(( "No channel selected -> cancel\n" )); |
66 | return QString( "No channel selected. Operation cancelled" ); | 66 | return QString( "No channel selected. Operation cancelled" ); |
67 | } | 67 | } |
68 | } | 68 | } |
69 | 69 | ||
70 | if( A == Deactivate ) { | 70 | if( A == Deactivate ) { |
71 | if( DeviceNr >= 0 ) { | 71 | if( DeviceNr >= 0 ) { |
72 | if( OT->releaseRFCommDevice( DeviceNr ) ) { | 72 | if( OT->releaseRFCommDevice( DeviceNr ) ) { |
73 | return QString( "Cannot release RFCOMM connection" ); | 73 | return QString( "Cannot release RFCOMM connection" ); |
74 | } | 74 | } |
75 | DeviceNr = -1; | 75 | DeviceNr = -1; |
76 | } | 76 | } |
77 | } | 77 | } |
78 | return QString(); | 78 | return QString(); |
79 | } | 79 | } |
80 | 80 | ||
81 | #include <qlistbox.h> | 81 | #include <qlistbox.h> |
82 | #include <qframe.h> | 82 | #include <qframe.h> |
83 | #include <qlabel.h> | 83 | #include <qlabel.h> |
84 | #include <qlayout.h> | 84 | #include <qlayout.h> |
85 | #include <qdialog.h> | 85 | #include <qdialog.h> |
86 | 86 | ||
87 | RFCOMMChannel * BluetoothRFCOMMRun::getChannel( void ) { | 87 | RFCOMMChannel * BluetoothRFCOMMRun::getChannel( void ) { |
88 | 88 | ||
89 | if( Data->Devices.count() == 1 ) { | 89 | if( Data->Devices.count() == 1 ) { |
90 | // only one device -> return channel | 90 | // only one device -> return channel |
91 | return Data->Devices[0]; | 91 | return Data->Devices[0]; |
92 | } | 92 | } |
93 | 93 | ||
94 | RFCOMMChannel * Ch = 0; | 94 | RFCOMMChannel * Ch = 0; |
95 | QDialog * Dlg = new QDialog( qApp->mainWidget(), 0, TRUE ); | 95 | QDialog * Dlg = new QDialog( qApp->mainWidget(), 0, TRUE ); |
96 | QVBoxLayout * V = new QVBoxLayout( Dlg ); | 96 | QVBoxLayout * V = new QVBoxLayout( Dlg ); |
97 | 97 | ||
98 | QLabel * L = new QLabel( | 98 | QLabel * L = new QLabel( |
99 | qApp->translate( "BluetoothRFCOMMRun", | 99 | qApp->translate( "BluetoothRFCOMMRun", |
100 | "Select device to connect to"), | 100 | "Select device to connect to"), |
101 | Dlg ); | 101 | Dlg ); |
102 | QListBox * LB = new QListBox( Dlg ); | 102 | QListBox * LB = new QListBox( Dlg ); |
103 | 103 | ||
104 | for( unsigned int i = 0; i < Data->Devices.count(); i ++ ) { | 104 | for( unsigned int i = 0; i < Data->Devices.count(); i ++ ) { |
105 | LB->insertItem( QString( "%1 (%2 Chnl %3)" ). | 105 | LB->insertItem( QString( "%1 (%2 Chnl %3)" ). |
106 | arg( Data->Devices[i]->Name ). | 106 | arg( Data->Devices[i]->Name ). |
107 | arg( Data->Devices[i]->BDAddress ). | 107 | arg( Data->Devices[i]->BDAddress ). |
108 | arg( Data->Devices[i]->Channel ) ); | 108 | arg( Data->Devices[i]->Channel ) ); |
109 | } | 109 | } |
110 | 110 | ||
111 | V->addWidget( L ); | 111 | V->addWidget( L ); |
112 | V->addWidget( LB ); | 112 | V->addWidget( LB ); |
113 | 113 | ||
114 | Dlg->resize( 100, 100 ); | 114 | Dlg->resize( 100, 100 ); |
115 | Dlg->move( 20, | 115 | Dlg->move( 20, |
116 | (qApp->desktop()->height()-100)/2 ); | 116 | (qApp->desktop()->height()-100)/2 ); |
117 | 117 | ||
118 | if( Dlg->exec() == QDialog::Accepted ) { | 118 | if( Dlg->exec() == QDialog::Accepted ) { |
119 | unsigned int i = 0; | 119 | unsigned int i = 0; |
120 | for( i = 0; i < Data->Devices.count(); i ++ ) { | 120 | for( i = 0; i < Data->Devices.count(); i ++ ) { |
121 | if( LB->isSelected(i) ) { | 121 | if( LB->isSelected(i) ) { |
122 | owarn << "Selected " << Data->Devices[i]->Name << oendl; | 122 | odebug << "Selected " << Data->Devices[i]->Name << oendl; |
123 | Ch = Data->Devices[i]; | 123 | Ch = Data->Devices[i]; |
124 | break; | 124 | break; |
125 | } | 125 | } |
126 | } | 126 | } |
127 | } | 127 | } |
128 | 128 | ||
129 | delete Dlg; | 129 | delete Dlg; |
130 | return Ch; | 130 | return Ch; |
131 | } | 131 | } |
132 | 132 | ||
133 | QString BluetoothRFCOMMRun::deviceFile( void ) { | 133 | QString BluetoothRFCOMMRun::deviceFile( void ) { |
134 | if( deviceNrOfConnection() >= 0 ) { | 134 | if( deviceNrOfConnection() >= 0 ) { |
135 | OTDevice * OTD = OT->getOTDevice(); | 135 | OTDevice * OTD = OT->getOTDevice(); |
136 | // there is a connection | 136 | // there is a connection |
137 | return OTD->getRFCommDevicePattern().arg(DeviceNr); | 137 | return OTD->getRFCommDevicePattern().arg(DeviceNr); |
138 | } | 138 | } |
139 | return QString(); | 139 | return QString(); |
140 | } | 140 | } |
141 | 141 | ||
142 | int BluetoothRFCOMMRun::deviceNrOfConnection( void ) { | 142 | int BluetoothRFCOMMRun::deviceNrOfConnection( void ) { |
143 | 143 | ||
144 | if( ! OT ) { | 144 | if( ! OT ) { |
145 | OT = OTGateway::getOTGateway(); | 145 | OT = OTGateway::getOTGateway(); |
146 | } | 146 | } |
147 | 147 | ||
148 | DeviceNr = -1; | 148 | DeviceNr = -1; |
149 | for( unsigned int i = 0; i < Data->Devices.count(); i ++ ) { | 149 | for( unsigned int i = 0; i < Data->Devices.count(); i ++ ) { |
150 | owarn << "Check for rfcomm on " | 150 | odebug << "Check for rfcomm on " |
151 | << Data->Devices[i]->BDAddress | 151 | << Data->Devices[i]->BDAddress |
152 | << " " | 152 | << " " |
153 | << Data->Devices[i]->Channel | 153 | << Data->Devices[i]->Channel |
154 | << oendl; | 154 | << oendl; |
155 | if( ( DeviceNr = OT->connectedToRFCommChannel( | 155 | if( ( DeviceNr = OT->connectedToRFCommChannel( |
156 | OTDeviceAddress( Data->Devices[i]->BDAddress ), | 156 | OTDeviceAddress( Data->Devices[i]->BDAddress ), |
157 | Data->Devices[i]->Channel ) ) >= 0 ) { | 157 | Data->Devices[i]->Channel ) ) >= 0 ) { |
158 | owarn << "Up " | 158 | odebug << "Up " |
159 | << oendl; | 159 | << oendl; |
160 | break; | 160 | break; |
161 | } | 161 | } |
162 | } | 162 | } |
163 | return DeviceNr; | 163 | return DeviceNr; |
164 | } | 164 | } |
diff --git a/noncore/settings/networksettings2/bluetooth/config.in b/noncore/settings/networksettings2/bluetooth/config.in index 398cff1..1a76f96 100644 --- a/noncore/settings/networksettings2/bluetooth/config.in +++ b/noncore/settings/networksettings2/bluetooth/config.in | |||
@@ -1,4 +1,4 @@ | |||
1 | config NS2BT | 1 | config NS2BT |
2 | boolean "opie-networksettings2plugin-bluetooth (set up BLUETOOTH)" | 2 | boolean "opie-networksettings2plugin-bluetooth (set up BLUETOOTH)" |
3 | default "n" if NS2 | 3 | default "n" if NS2 |
4 | depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE && NS2CORE && NS2OPIETOOTH | 4 | depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE && NS2CORE && NS2OPIETOOTH && LIBBLUEZ_DEP |
diff --git a/noncore/settings/networksettings2/config.in b/noncore/settings/networksettings2/config.in index d2b5f26..0236bab 100644 --- a/noncore/settings/networksettings2/config.in +++ b/noncore/settings/networksettings2/config.in | |||
@@ -1,21 +1,21 @@ | |||
1 | source noncore/settings/networksettings2/networksettings2/config.in | 1 | source noncore/settings/networksettings2/networksettings2/config.in |
2 | source noncore/settings/networksettings2/opietooth2/config.in | 2 | source noncore/settings/networksettings2/opietooth2/config.in |
3 | source noncore/settings/networksettings2/opietooth2_applet/config.in | 3 | source noncore/settings/networksettings2/opietooth2_applet/config.in |
4 | 4 | ||
5 | config NS2 | 5 | config NS2 |
6 | boolean | 6 | boolean "opie-networksettings2 application" |
7 | default "y" | 7 | default "y" |
8 | depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE && NS2CORE && NS2OPIETOOTH | 8 | depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE && NS2CORE && NS2OPIETOOTH |
9 | 9 | ||
10 | source noncore/settings/networksettings2/profile/config.in | 10 | source noncore/settings/networksettings2/profile/config.in |
11 | source noncore/settings/networksettings2/network/config.in | 11 | source noncore/settings/networksettings2/network/config.in |
12 | source noncore/settings/networksettings2/lancard/config.in | 12 | source noncore/settings/networksettings2/lancard/config.in |
13 | source noncore/settings/networksettings2/ppp/config.in | 13 | source noncore/settings/networksettings2/ppp/config.in |
14 | source noncore/settings/networksettings2/wlan/config.in | 14 | source noncore/settings/networksettings2/wlan/config.in |
15 | source noncore/settings/networksettings2/usb/config.in | 15 | source noncore/settings/networksettings2/usb/config.in |
16 | source noncore/settings/networksettings2/irda/config.in | 16 | source noncore/settings/networksettings2/irda/config.in |
17 | source noncore/settings/networksettings2/vpn/config.in | 17 | source noncore/settings/networksettings2/vpn/config.in |
18 | source noncore/settings/networksettings2/bluetooth/config.in | 18 | source noncore/settings/networksettings2/bluetooth/config.in |
19 | source noncore/settings/networksettings2/cable/config.in | 19 | source noncore/settings/networksettings2/cable/config.in |
20 | source noncore/settings/networksettings2/modem/config.in | 20 | source noncore/settings/networksettings2/modem/config.in |
21 | source noncore/settings/networksettings2/gprs/config.in | 21 | source noncore/settings/networksettings2/gprs/config.in |
diff --git a/noncore/settings/networksettings2/editconnection.cpp b/noncore/settings/networksettings2/editconnection.cpp index 0c3ead6..717d9e9 100644 --- a/noncore/settings/networksettings2/editconnection.cpp +++ b/noncore/settings/networksettings2/editconnection.cpp | |||
@@ -1,630 +1,629 @@ | |||
1 | #include <opie2/odebug.h> | 1 | #include <opie2/odebug.h> |
2 | #include <qlistview.h> | 2 | #include <qlistview.h> |
3 | #include <qwidgetstack.h> | 3 | #include <qwidgetstack.h> |
4 | #include <qframe.h> | 4 | #include <qframe.h> |
5 | #include <qcombobox.h> | 5 | #include <qcombobox.h> |
6 | #include <qtabwidget.h> | 6 | #include <qtabwidget.h> |
7 | #include <qmessagebox.h> | 7 | #include <qmessagebox.h> |
8 | #include <qpushbutton.h> | 8 | #include <qpushbutton.h> |
9 | #include <qlineedit.h> | 9 | #include <qlineedit.h> |
10 | #include <qheader.h> | 10 | #include <qheader.h> |
11 | #include <qpainter.h> | 11 | #include <qpainter.h> |
12 | #include <qcheckbox.h> | 12 | #include <qcheckbox.h> |
13 | #include <qlabel.h> | 13 | #include <qlabel.h> |
14 | 14 | ||
15 | #include "editconnection.h" | 15 | #include "editconnection.h" |
16 | #include "resources.h" | 16 | #include "resources.h" |
17 | #include "netnode.h" | 17 | #include "netnode.h" |
18 | 18 | ||
19 | // | 19 | // |
20 | // | 20 | // |
21 | // THESE TO GIVE BETTER FEEDBACK ABOUT DISABLED ITEMS | 21 | // THESE TO GIVE BETTER FEEDBACK ABOUT DISABLED ITEMS |
22 | // | 22 | // |
23 | // | 23 | // |
24 | 24 | ||
25 | class MyQCheckListItem : public QCheckListItem | 25 | class MyQCheckListItem : public QCheckListItem |
26 | { | 26 | { |
27 | public: | 27 | public: |
28 | MyQCheckListItem( QListView *parent, const QString & S, Type T ) : | 28 | MyQCheckListItem( QListView *parent, const QString & S, Type T ) : |
29 | QCheckListItem( parent, S, T ) { } | 29 | QCheckListItem( parent, S, T ) { } |
30 | MyQCheckListItem( QCheckListItem *parent, const QString & S, Type T ) : | 30 | MyQCheckListItem( QCheckListItem *parent, const QString & S, Type T ) : |
31 | QCheckListItem( parent, S, T ) { } | 31 | QCheckListItem( parent, S, T ) { } |
32 | MyQCheckListItem( QListViewItem *parent, const QString & S, Type T ) : | 32 | MyQCheckListItem( QListViewItem *parent, const QString & S, Type T ) : |
33 | QCheckListItem( parent, S, T ) { } | 33 | QCheckListItem( parent, S, T ) { } |
34 | 34 | ||
35 | MyQCheckListItem( QListView *parent, const QString & S ) : | 35 | MyQCheckListItem( QListView *parent, const QString & S ) : |
36 | QCheckListItem( parent, S, QCheckListItem::Controller ) { } | 36 | QCheckListItem( parent, S, QCheckListItem::Controller ) { } |
37 | MyQCheckListItem( QCheckListItem *parent, const QString & S ) : | 37 | MyQCheckListItem( QCheckListItem *parent, const QString & S ) : |
38 | QCheckListItem( parent, S, QCheckListItem::Controller ) { } | 38 | QCheckListItem( parent, S, QCheckListItem::Controller ) { } |
39 | MyQCheckListItem( QListViewItem *parent, const QString & S ) : | 39 | MyQCheckListItem( QListViewItem *parent, const QString & S ) : |
40 | QCheckListItem( parent, S, QCheckListItem::Controller ) { } | 40 | QCheckListItem( parent, S, QCheckListItem::Controller ) { } |
41 | 41 | ||
42 | virtual void paintCell( QPainter *p, const QColorGroup &cg, | 42 | virtual void paintCell( QPainter *p, const QColorGroup &cg, |
43 | int column, int width, int alignment ); | 43 | int column, int width, int alignment ); |
44 | 44 | ||
45 | }; | 45 | }; |
46 | 46 | ||
47 | void MyQCheckListItem::paintCell( QPainter *p, const QColorGroup &cg, | 47 | void MyQCheckListItem::paintCell( QPainter *p, const QColorGroup &cg, |
48 | int column, int width, int alignment ) | 48 | int column, int width, int alignment ) |
49 | { | 49 | { |
50 | QColorGroup _cg( cg ); | 50 | QColorGroup _cg( cg ); |
51 | QColor c = _cg.text(); | 51 | QColor c = _cg.text(); |
52 | if ( ! isSelectable() ) | 52 | if ( ! isSelectable() ) |
53 | _cg.setColor( QColorGroup::Text, Qt::lightGray ); | 53 | _cg.setColor( QColorGroup::Text, Qt::lightGray ); |
54 | QCheckListItem::paintCell( p, _cg, column, width, alignment ); | 54 | QCheckListItem::paintCell( p, _cg, column, width, alignment ); |
55 | _cg.setColor( QColorGroup::Text, c ); | 55 | _cg.setColor( QColorGroup::Text, c ); |
56 | } | 56 | } |
57 | 57 | ||
58 | class MyQListViewItem : public QListViewItem | 58 | class MyQListViewItem : public QListViewItem |
59 | { | 59 | { |
60 | public: | 60 | public: |
61 | MyQListViewItem( QListView *parent, const QString & S ) : | 61 | MyQListViewItem( QListView *parent, const QString & S ) : |
62 | QListViewItem( parent, S ) { } | 62 | QListViewItem( parent, S ) { } |
63 | MyQListViewItem( QListViewItem *parent, const QString & S ) : | 63 | MyQListViewItem( QListViewItem *parent, const QString & S ) : |
64 | QListViewItem( parent, S ) { } | 64 | QListViewItem( parent, S ) { } |
65 | 65 | ||
66 | virtual void paintCell( QPainter *p, const QColorGroup &cg, | 66 | virtual void paintCell( QPainter *p, const QColorGroup &cg, |
67 | int column, int width, int alignment ); | 67 | int column, int width, int alignment ); |
68 | 68 | ||
69 | }; | 69 | }; |
70 | 70 | ||
71 | void MyQListViewItem::paintCell( QPainter *p, const QColorGroup &cg, | 71 | void MyQListViewItem::paintCell( QPainter *p, const QColorGroup &cg, |
72 | int column, int width, int alignment ) | 72 | int column, int width, int alignment ) |
73 | { | 73 | { |
74 | QColorGroup _cg( cg ); | 74 | QColorGroup _cg( cg ); |
75 | QColor c = _cg.text(); | 75 | QColor c = _cg.text(); |
76 | if ( ! isSelectable() ) | 76 | if ( ! isSelectable() ) |
77 | _cg.setColor( QColorGroup::Text, Qt::lightGray ); | 77 | _cg.setColor( QColorGroup::Text, Qt::lightGray ); |
78 | QListViewItem::paintCell( p, _cg, column, width, alignment ); | 78 | QListViewItem::paintCell( p, _cg, column, width, alignment ); |
79 | _cg.setColor( QColorGroup::Text, c ); | 79 | _cg.setColor( QColorGroup::Text, c ); |
80 | } | 80 | } |
81 | 81 | ||
82 | // | 82 | // |
83 | // | 83 | // |
84 | // REAL GUI | 84 | // REAL GUI |
85 | // | 85 | // |
86 | // | 86 | // |
87 | 87 | ||
88 | bool EditConnection::AutoCollapse = 1; | 88 | bool EditConnection::AutoCollapse = 1; |
89 | 89 | ||
90 | EditConnection::EditConnection( QWidget* parent ) : | 90 | EditConnection::EditConnection( QWidget* parent ) : |
91 | EditConnectionGUI( parent, 0, TRUE ), TmpCollection() { | 91 | EditConnectionGUI( parent, 0, TRUE ), TmpCollection() { |
92 | 92 | ||
93 | Tab_TB->setTabEnabled( Setup_FRM, FALSE ); | 93 | Tab_TB->setTabEnabled( Setup_FRM, FALSE ); |
94 | Setup_FRM->setEnabled( FALSE ); | 94 | Setup_FRM->setEnabled( FALSE ); |
95 | 95 | ||
96 | TmpIsValid = 0; | 96 | TmpIsValid = 0; |
97 | SelectedNodes = 0; | 97 | SelectedNodes = 0; |
98 | 98 | ||
99 | AutoCollapse_CB->setChecked( AutoCollapse ); | 99 | AutoCollapse_CB->setChecked( AutoCollapse ); |
100 | 100 | ||
101 | Mapping = new QPtrDict<ANetNode>; | 101 | Mapping = new QPtrDict<ANetNode>; |
102 | Mapping->setAutoDelete( FALSE ); | 102 | Mapping->setAutoDelete( FALSE ); |
103 | Nodes_LV->header()->hide(); | 103 | Nodes_LV->header()->hide(); |
104 | // popluate tree with all NetNodes | 104 | // popluate tree with all NetNodes |
105 | buildFullTree(); | 105 | buildFullTree(); |
106 | } | 106 | } |
107 | 107 | ||
108 | NodeCollection * EditConnection::getTmpCollection( void ) { | 108 | NodeCollection * EditConnection::getTmpCollection( void ) { |
109 | 109 | ||
110 | if( TmpIsValid ) | 110 | if( TmpIsValid ) |
111 | // content is stil OK | 111 | // content is stil OK |
112 | return &(TmpCollection); | 112 | return &(TmpCollection); |
113 | 113 | ||
114 | // reset collection -> delete all NEW NetNodes | 114 | // reset collection -> delete all NEW NetNodes |
115 | for( QListIterator<ANetNodeInstance> it(TmpCollection); | 115 | for( QListIterator<ANetNodeInstance> it(TmpCollection); |
116 | it.current(); | 116 | it.current(); |
117 | ++it ) { | 117 | ++it ) { |
118 | if( it.current()->isNew() ) { | 118 | if( it.current()->isNew() ) { |
119 | delete it.current(); | 119 | delete it.current(); |
120 | } | 120 | } |
121 | } | 121 | } |
122 | TmpCollection.clear(); | 122 | TmpCollection.clear(); |
123 | 123 | ||
124 | // update content | 124 | // update content |
125 | QListViewItem * it = Nodes_LV->firstChild(); | 125 | QListViewItem * it = Nodes_LV->firstChild(); |
126 | ANetNode * NN; | 126 | ANetNode * NN; |
127 | 127 | ||
128 | // start iter (if there is a collection) | 128 | // start iter (if there is a collection) |
129 | /* | 129 | /* |
130 | 130 | ||
131 | a node collection is sorted from the toplevel | 131 | a node collection is sorted from the toplevel |
132 | node to the deepest node | 132 | node to the deepest node |
133 | 133 | ||
134 | */ | 134 | */ |
135 | ANetNodeInstance * NNI = | 135 | ANetNodeInstance * NNI = |
136 | (SelectedNodes) ? SelectedNodes->first() : 0 ; | 136 | (SelectedNodes) ? SelectedNodes->first() : 0 ; |
137 | 137 | ||
138 | TmpCollection.setModified( 0 ); | 138 | TmpCollection.setModified( 0 ); |
139 | 139 | ||
140 | // the listview always starts with the toplevel | 140 | // the listview always starts with the toplevel |
141 | // hierarchy. This is always a controller item | 141 | // hierarchy. This is always a controller item |
142 | while ( it ) { | 142 | while ( it ) { |
143 | NN = (*Mapping)[it]; | 143 | NN = (*Mapping)[it]; |
144 | if( NN == 0 ) { | 144 | if( NN == 0 ) { |
145 | // this item is a controller -> | 145 | // this item is a controller -> |
146 | // has radio items as children -> | 146 | // has radio items as children -> |
147 | // find selected one | 147 | // find selected one |
148 | it = it->firstChild(); | 148 | it = it->firstChild(); |
149 | while( it ) { | 149 | while( it ) { |
150 | if( ((QCheckListItem *)it)->isOn() ) { | 150 | if( ((QCheckListItem *)it)->isOn() ) { |
151 | // this radio is selected -> go deeper | 151 | // this radio is selected -> go deeper |
152 | break; | 152 | break; |
153 | } | 153 | } |
154 | it = it->nextSibling(); | 154 | it = it->nextSibling(); |
155 | } | 155 | } |
156 | 156 | ||
157 | if( ! it ) { | 157 | if( ! it ) { |
158 | owarn << "Radio not selected" << oendl; | ||
159 | TmpIsValid = 0; | 158 | TmpIsValid = 0; |
160 | return 0; | 159 | return 0; |
161 | } | 160 | } |
162 | 161 | ||
163 | // it now contains selected radio | 162 | // it now contains selected radio |
164 | NN = (*Mapping)[it]; | 163 | NN = (*Mapping)[it]; |
165 | } | 164 | } |
166 | 165 | ||
167 | // NN here contains the netnode of the | 166 | // NN here contains the netnode of the |
168 | // current item -> this node needs to | 167 | // current item -> this node needs to |
169 | // be stored in the collection | 168 | // be stored in the collection |
170 | if( NNI == 0 || | 169 | if( NNI == 0 || |
171 | it->text(0) != NNI->nodeClass()->name() ) { | 170 | it->text(0) != NNI->nodeClass()->name() ) { |
172 | // new item not in previous collection | 171 | // new item not in previous collection |
173 | ANetNodeInstance * NNI = NN->createInstance(); | 172 | ANetNodeInstance * NNI = NN->createInstance(); |
174 | NNI->initialize(); | 173 | NNI->initialize(); |
175 | // this node type not in collection | 174 | // this node type not in collection |
176 | TmpCollection.append( NNI ); | 175 | TmpCollection.append( NNI ); |
177 | // master collection changed because new item in it | 176 | // master collection changed because new item in it |
178 | TmpCollection.setModified( 1 ); | 177 | TmpCollection.setModified( 1 ); |
179 | // no more valid items in old list | 178 | // no more valid items in old list |
180 | NNI = 0; | 179 | NNI = 0; |
181 | } else { | 180 | } else { |
182 | // already in list -> copy pointer | 181 | // already in list -> copy pointer |
183 | TmpCollection.append( NNI ); | 182 | TmpCollection.append( NNI ); |
184 | NNI = SelectedNodes->next(); | 183 | NNI = SelectedNodes->next(); |
185 | } | 184 | } |
186 | 185 | ||
187 | // go deeper to next level | 186 | // go deeper to next level |
188 | // this level is can be a new controller | 187 | // this level is can be a new controller |
189 | // or an item | 188 | // or an item |
190 | it = it->firstChild(); | 189 | it = it->firstChild(); |
191 | } | 190 | } |
192 | 191 | ||
193 | TmpIsValid = 1; | 192 | TmpIsValid = 1; |
194 | return &(TmpCollection); | 193 | return &(TmpCollection); |
195 | } | 194 | } |
196 | 195 | ||
197 | // pass a connection NodeCollection to be edited | 196 | // pass a connection NodeCollection to be edited |
198 | void EditConnection::setConnection( NodeCollection * NC ) { | 197 | void EditConnection::setConnection( NodeCollection * NC ) { |
199 | ANetNodeInstance * NNI; | 198 | ANetNodeInstance * NNI; |
200 | ANetNode * NN; | 199 | ANetNode * NN; |
201 | 200 | ||
202 | SelectedNodes = NC; | 201 | SelectedNodes = NC; |
203 | Name_LE->setText( NC->name() ); | 202 | Name_LE->setText( NC->name() ); |
204 | NNI = NC->first(); | 203 | NNI = NC->first(); |
205 | 204 | ||
206 | // show configure tabl | 205 | // show configure tabl |
207 | Tab_TB->setCurrentPage( 1 ); | 206 | Tab_TB->setCurrentPage( 1 ); |
208 | 207 | ||
209 | // valid colledction | 208 | // valid colledction |
210 | Tab_TB->setTabEnabled( Setup_FRM, FALSE ); | 209 | Tab_TB->setTabEnabled( Setup_FRM, FALSE ); |
211 | Setup_FRM->setEnabled( FALSE ); | 210 | Setup_FRM->setEnabled( FALSE ); |
212 | 211 | ||
213 | // select items in collection | 212 | // select items in collection |
214 | QListViewItem * it = Nodes_LV->firstChild(); | 213 | QListViewItem * it = Nodes_LV->firstChild(); |
215 | bool Found; | 214 | bool Found; |
216 | 215 | ||
217 | TmpIsValid = 0; | 216 | TmpIsValid = 0; |
218 | 217 | ||
219 | while ( it ) { | 218 | while ( it ) { |
220 | NN = (*Mapping)[it]; | 219 | NN = (*Mapping)[it]; |
221 | if( NN == 0 ) { | 220 | if( NN == 0 ) { |
222 | // this item is a controller -> | 221 | // this item is a controller -> |
223 | // has radio items as children -> | 222 | // has radio items as children -> |
224 | // find selected one | 223 | // find selected one |
225 | it = it->firstChild(); | 224 | it = it->firstChild(); |
226 | Found = 0; | 225 | Found = 0; |
227 | while( it ) { | 226 | while( it ) { |
228 | if( NNI && it->text(0) == NNI->nodeClass()->name() ) { | 227 | if( NNI && it->text(0) == NNI->nodeClass()->name() ) { |
229 | // this radio is part of the collection | 228 | // this radio is part of the collection |
230 | ((QCheckListItem *)it)->setOn( 1 ); | 229 | ((QCheckListItem *)it)->setOn( 1 ); |
231 | updateGUI( it, NNI->nodeClass() ); | 230 | updateGUI( it, NNI->nodeClass() ); |
232 | // check its children | 231 | // check its children |
233 | Found = 1; | 232 | Found = 1; |
234 | it = it->firstChild(); | 233 | it = it->firstChild(); |
235 | NNI = SelectedNodes->next(); | 234 | NNI = SelectedNodes->next(); |
236 | // do not bother to check other items | 235 | // do not bother to check other items |
237 | break; | 236 | break; |
238 | } | 237 | } |
239 | it = it->nextSibling(); | 238 | it = it->nextSibling(); |
240 | } | 239 | } |
241 | 240 | ||
242 | if( ! Found ) { | 241 | if( ! Found ) { |
243 | // this means that this level is NOT present in collection | 242 | // this means that this level is NOT present in collection |
244 | // probably INCOMPATIBEL collection OR Missing plugin | 243 | // probably INCOMPATIBEL collection OR Missing plugin |
245 | QMessageBox::warning( | 244 | QMessageBox::warning( |
246 | 0, | 245 | 0, |
247 | tr( "Error presentig Connection" ), | 246 | tr( "Error presentig Connection" ), |
248 | tr( "<p>Old connection or missing plugin \"<i>%1</i>\"</p>" ). | 247 | tr( "<p>Old connection or missing plugin \"<i>%1</i>\"</p>" ). |
249 | arg(NNI->nodeClass()->name()) ); | 248 | arg(NNI->nodeClass()->name()) ); |
250 | return; | 249 | return; |
251 | } | 250 | } |
252 | 251 | ||
253 | // it now contains selected radio | 252 | // it now contains selected radio |
254 | NN = (*Mapping)[it]; | 253 | NN = (*Mapping)[it]; |
255 | } else { | 254 | } else { |
256 | // automatic selection | 255 | // automatic selection |
257 | if( NNI == 0 || it->text(0) != NNI->nodeClass()->name() ) { | 256 | if( NNI == 0 || it->text(0) != NNI->nodeClass()->name() ) { |
258 | // should exist and be the same | 257 | // should exist and be the same |
259 | if( NNI ) { | 258 | if( NNI ) { |
260 | QMessageBox::warning( | 259 | QMessageBox::warning( |
261 | 0, | 260 | 0, |
262 | tr( "Error presentig Connection" ), | 261 | tr( "Error presentig Connection" ), |
263 | tr( "<p>Old connection or missing plugin \"<i>%1</i>\"</p>" ). | 262 | tr( "<p>Old connection or missing plugin \"<i>%1</i>\"</p>" ). |
264 | arg(NNI->nodeClass()->name()) ); | 263 | arg(NNI->nodeClass()->name()) ); |
265 | } else { | 264 | } else { |
266 | QMessageBox::warning( | 265 | QMessageBox::warning( |
267 | 0, | 266 | 0, |
268 | tr( "Error presentig Connection" ), | 267 | tr( "Error presentig Connection" ), |
269 | tr( "<p>Missing connection\"<i>%1</i>\"</p>" ). | 268 | tr( "<p>Missing connection\"<i>%1</i>\"</p>" ). |
270 | arg(it->text(0)) ); | 269 | arg(it->text(0)) ); |
271 | } | 270 | } |
272 | return; | 271 | return; |
273 | } | 272 | } |
274 | it = it->firstChild(); | 273 | it = it->firstChild(); |
275 | } | 274 | } |
276 | } | 275 | } |
277 | } | 276 | } |
278 | 277 | ||
279 | // get result of editing (either new OR updated collection | 278 | // get result of editing (either new OR updated collection |
280 | NodeCollection * EditConnection::connection( void ) { | 279 | NodeCollection * EditConnection::connection( void ) { |
281 | 280 | ||
282 | if( SelectedNodes == 0 ) { | 281 | if( SelectedNodes == 0 ) { |
283 | // new collection | 282 | // new collection |
284 | SelectedNodes = new NodeCollection; | 283 | SelectedNodes = new NodeCollection; |
285 | } | 284 | } |
286 | 285 | ||
287 | // clean out old entries | 286 | // clean out old entries |
288 | SelectedNodes->clear(); | 287 | SelectedNodes->clear(); |
289 | 288 | ||
290 | // transfer | 289 | // transfer |
291 | for( QListIterator<ANetNodeInstance> it(TmpCollection); | 290 | for( QListIterator<ANetNodeInstance> it(TmpCollection); |
292 | it.current(); | 291 | it.current(); |
293 | ++it ) { | 292 | ++it ) { |
294 | SelectedNodes->append( it.current() ); | 293 | SelectedNodes->append( it.current() ); |
295 | } | 294 | } |
296 | 295 | ||
297 | if( TmpCollection.isModified() ) | 296 | if( TmpCollection.isModified() ) |
298 | SelectedNodes->setModified( 1 ); | 297 | SelectedNodes->setModified( 1 ); |
299 | 298 | ||
300 | if( SelectedNodes->name() != Name_LE->text() ) { | 299 | if( SelectedNodes->name() != Name_LE->text() ) { |
301 | SelectedNodes->setName( Name_LE->text() ); | 300 | SelectedNodes->setName( Name_LE->text() ); |
302 | SelectedNodes->setModified( 1 ); | 301 | SelectedNodes->setModified( 1 ); |
303 | } | 302 | } |
304 | 303 | ||
305 | return SelectedNodes; | 304 | return SelectedNodes; |
306 | } | 305 | } |
307 | 306 | ||
308 | // Build device tree -> start | 307 | // Build device tree -> start |
309 | void EditConnection::buildFullTree( void ) { | 308 | void EditConnection::buildFullTree( void ) { |
310 | ANetNode * NN; | 309 | ANetNode * NN; |
311 | 310 | ||
312 | // toplevel item | 311 | // toplevel item |
313 | MyQCheckListItem * TheTop = new MyQCheckListItem( | 312 | MyQCheckListItem * TheTop = new MyQCheckListItem( |
314 | Nodes_LV, | 313 | Nodes_LV, |
315 | NSResources->netNode2Name("fullsetup"), | 314 | NSResources->netNode2Name("fullsetup"), |
316 | QCheckListItem::Controller ); | 315 | QCheckListItem::Controller ); |
317 | TheTop->setOpen( TRUE ); | 316 | TheTop->setOpen( TRUE ); |
318 | Description_LBL->setText( | 317 | Description_LBL->setText( |
319 | NSResources->netNode2Description( "fullsetup" ) ); | 318 | NSResources->netNode2Description( "fullsetup" ) ); |
320 | Nodes_LV->setSelected( TheTop, TRUE ); | 319 | Nodes_LV->setSelected( TheTop, TRUE ); |
321 | 320 | ||
322 | // find all Nodes that are toplevel nodes -> ie provide | 321 | // find all Nodes that are toplevel nodes -> ie provide |
323 | // TCP/IP Connection | 322 | // TCP/IP Connection |
324 | for( QDictIterator<ANetNode> Iter(NSResources->netNodes()); | 323 | for( QDictIterator<ANetNode> Iter(NSResources->netNodes()); |
325 | Iter.current(); | 324 | Iter.current(); |
326 | ++Iter ) { | 325 | ++Iter ) { |
327 | NN = Iter.current(); | 326 | NN = Iter.current(); |
328 | 327 | ||
329 | if( ! NN->isToplevel() ) { | 328 | if( ! NN->isToplevel() ) { |
330 | continue; | 329 | continue; |
331 | } | 330 | } |
332 | 331 | ||
333 | MyQCheckListItem * it = new MyQCheckListItem( TheTop, | 332 | MyQCheckListItem * it = new MyQCheckListItem( TheTop, |
334 | NN->name(), | 333 | NN->name(), |
335 | QCheckListItem::RadioButton ); | 334 | QCheckListItem::RadioButton ); |
336 | it->setPixmap( 0, | 335 | it->setPixmap( 0, |
337 | NSResources->getPixmap( NN->pixmapName() ) | 336 | NSResources->getPixmap( NN->pixmapName() ) |
338 | ); | 337 | ); |
339 | // remember that this node maps to this listitem | 338 | // remember that this node maps to this listitem |
340 | Mapping->insert( it, NN ); | 339 | Mapping->insert( it, NN ); |
341 | buildSubTree( it, NN ); | 340 | buildSubTree( it, NN ); |
342 | } | 341 | } |
343 | } | 342 | } |
344 | 343 | ||
345 | // Build device tree -> help function | 344 | // Build device tree -> help function |
346 | void EditConnection::buildSubTree( QListViewItem * it, ANetNode *NN ) { | 345 | void EditConnection::buildSubTree( QListViewItem * it, ANetNode *NN ) { |
347 | ANetNode::NetNodeList & NNL = NN->alternatives(); | 346 | ANetNode::NetNodeList & NNL = NN->alternatives(); |
348 | 347 | ||
349 | if( NNL.size() > 1 ) { | 348 | if( NNL.size() > 1 ) { |
350 | // this node has alternatives -> needs radio buttons | 349 | // this node has alternatives -> needs radio buttons |
351 | it = new MyQCheckListItem( | 350 | it = new MyQCheckListItem( |
352 | it, | 351 | it, |
353 | NSResources->netNode2Name(NN->needs()[0]), | 352 | NSResources->netNode2Name(NN->needs()[0]), |
354 | QCheckListItem::Controller ); | 353 | QCheckListItem::Controller ); |
355 | it->setSelectable( FALSE ); | 354 | it->setSelectable( FALSE ); |
356 | } | 355 | } |
357 | 356 | ||
358 | for ( unsigned int i=0; i < NNL.size(); i++ ) { | 357 | for ( unsigned int i=0; i < NNL.size(); i++ ) { |
359 | QListViewItem * CI; | 358 | QListViewItem * CI; |
360 | if( NNL.size() > 1 ) { | 359 | if( NNL.size() > 1 ) { |
361 | // generate radio buttons | 360 | // generate radio buttons |
362 | CI = new MyQCheckListItem( | 361 | CI = new MyQCheckListItem( |
363 | (QCheckListItem *)it, | 362 | (QCheckListItem *)it, |
364 | NNL[i]->name(), QCheckListItem::RadioButton ); | 363 | NNL[i]->name(), QCheckListItem::RadioButton ); |
365 | // remember that this node maps to this listitem | 364 | // remember that this node maps to this listitem |
366 | CI->setPixmap( 0, NSResources->getPixmap( NNL[i]->pixmapName() ) ); | 365 | CI->setPixmap( 0, NSResources->getPixmap( NNL[i]->pixmapName() ) ); |
367 | Mapping->insert( CI, NNL[i] ); | 366 | Mapping->insert( CI, NNL[i] ); |
368 | CI->setSelectable( FALSE ); | 367 | CI->setSelectable( FALSE ); |
369 | } else { | 368 | } else { |
370 | // Single item | 369 | // Single item |
371 | CI = new MyQListViewItem( it, NNL[i]->name() ); | 370 | CI = new MyQListViewItem( it, NNL[i]->name() ); |
372 | // remember that this node maps to this listitem | 371 | // remember that this node maps to this listitem |
373 | Mapping->insert( CI, NNL[i] ); | 372 | Mapping->insert( CI, NNL[i] ); |
374 | CI->setSelectable( FALSE ); | 373 | CI->setSelectable( FALSE ); |
375 | CI->setPixmap( 0, NSResources->getPixmap( NNL[i]->pixmapName() ) ); | 374 | CI->setPixmap( 0, NSResources->getPixmap( NNL[i]->pixmapName() ) ); |
376 | } | 375 | } |
377 | buildSubTree( CI, NNL[i] ); | 376 | buildSubTree( CI, NNL[i] ); |
378 | } | 377 | } |
379 | } | 378 | } |
380 | 379 | ||
381 | // Clicked ok OK button | 380 | // Clicked ok OK button |
382 | void EditConnection::accept( void ) { | 381 | void EditConnection::accept( void ) { |
383 | if( ! haveCompleteConfig( 0 ) || Name_LE->text().isEmpty() ) { | 382 | if( ! haveCompleteConfig( 0 ) || Name_LE->text().isEmpty() ) { |
384 | QMessageBox::warning( | 383 | QMessageBox::warning( |
385 | 0, | 384 | 0, |
386 | tr( "Closing Connection Setup" ), | 385 | tr( "Closing Connection Setup" ), |
387 | tr( "Definition not complete or no name" ) ); | 386 | tr( "Definition not complete or no name" ) ); |
388 | return; | 387 | return; |
389 | } | 388 | } |
390 | 389 | ||
391 | // check if all devices have acceptable input | 390 | // check if all devices have acceptable input |
392 | getTmpCollection(); | 391 | getTmpCollection(); |
393 | { ANetNodeInstance * NNI; | 392 | { ANetNodeInstance * NNI; |
394 | QString S; | 393 | QString S; |
395 | 394 | ||
396 | for( QListIterator<ANetNodeInstance> it(TmpCollection); | 395 | for( QListIterator<ANetNodeInstance> it(TmpCollection); |
397 | it.current(); | 396 | it.current(); |
398 | ++it ) { | 397 | ++it ) { |
399 | NNI = it.current(); | 398 | NNI = it.current(); |
400 | // widget must show its own problems | 399 | // widget must show its own problems |
401 | S = NNI->acceptable(); | 400 | S = NNI->acceptable(); |
402 | if( ! S.isEmpty() ) { | 401 | if( ! S.isEmpty() ) { |
403 | QMessageBox::warning( | 402 | QMessageBox::warning( |
404 | 0, | 403 | 0, |
405 | tr( "Cannot save" ), | 404 | tr( "Cannot save" ), |
406 | S ); | 405 | S ); |
407 | return; | 406 | return; |
408 | } | 407 | } |
409 | NNI->commit(); | 408 | NNI->commit(); |
410 | 409 | ||
411 | if( NNI->isModified() ) { | 410 | if( NNI->isModified() ) { |
412 | TmpCollection.setModified( 1 ); | 411 | TmpCollection.setModified( 1 ); |
413 | // commit the data | 412 | // commit the data |
414 | } | 413 | } |
415 | } | 414 | } |
416 | } | 415 | } |
417 | 416 | ||
418 | QDialog::accept(); | 417 | QDialog::accept(); |
419 | } | 418 | } |
420 | 419 | ||
421 | // triggered by CB | 420 | // triggered by CB |
422 | void EditConnection::SLOT_AutoCollapse( bool b ) { | 421 | void EditConnection::SLOT_AutoCollapse( bool b ) { |
423 | AutoCollapse = b; | 422 | AutoCollapse = b; |
424 | } | 423 | } |
425 | 424 | ||
426 | // clicked on node in tree -> update GUI | 425 | // clicked on node in tree -> update GUI |
427 | void EditConnection::SLOT_SelectNode( QListViewItem * it ) { | 426 | void EditConnection::SLOT_SelectNode( QListViewItem * it ) { |
428 | ANetNode * NN; | 427 | ANetNode * NN; |
429 | if( it == 0 || it->depth() == 0 ) { | 428 | if( it == 0 || it->depth() == 0 ) { |
430 | Description_LBL->setText( | 429 | Description_LBL->setText( |
431 | NSResources->netNode2Description( "fullsetup" ) ); | 430 | NSResources->netNode2Description( "fullsetup" ) ); |
432 | // topevel or no selection | 431 | // topevel or no selection |
433 | return; | 432 | return; |
434 | } | 433 | } |
435 | 434 | ||
436 | // store conversion from lvitem to node | 435 | // store conversion from lvitem to node |
437 | NN = (*Mapping)[ it ]; | 436 | NN = (*Mapping)[ it ]; |
438 | 437 | ||
439 | if( ! NN ) { | 438 | if( ! NN ) { |
440 | // intermediate node | 439 | // intermediate node |
441 | NN = (*Mapping)[ it->parent() ]; | 440 | NN = (*Mapping)[ it->parent() ]; |
442 | if( NN ) { | 441 | if( NN ) { |
443 | // figure out type of this node -> produce mesage | 442 | // figure out type of this node -> produce mesage |
444 | Description_LBL->setText( NSResources->netNode2Description( | 443 | Description_LBL->setText( NSResources->netNode2Description( |
445 | NN->needs()[0]) ); | 444 | NN->needs()[0]) ); |
446 | } else { | 445 | } else { |
447 | Description_LBL->setText( "" ); | 446 | Description_LBL->setText( "" ); |
448 | } | 447 | } |
449 | return; | 448 | return; |
450 | } | 449 | } |
451 | 450 | ||
452 | Description_LBL->setText( NN->nodeDescription() ); | 451 | Description_LBL->setText( NN->nodeDescription() ); |
453 | 452 | ||
454 | if( ! it->isSelectable() ) { | 453 | if( ! it->isSelectable() ) { |
455 | return; | 454 | return; |
456 | } | 455 | } |
457 | 456 | ||
458 | if( ! ((QCheckListItem *)it)->isOn() ) { | 457 | if( ! ((QCheckListItem *)it)->isOn() ) { |
459 | // clicked on line but NOT on Check or Radio item | 458 | // clicked on line but NOT on Check or Radio item |
460 | return; | 459 | return; |
461 | } | 460 | } |
462 | 461 | ||
463 | // item has really changed -> update | 462 | // item has really changed -> update |
464 | TmpIsValid = 0; | 463 | TmpIsValid = 0; |
465 | updateGUI( it, NN ); | 464 | updateGUI( it, NN ); |
466 | } | 465 | } |
467 | 466 | ||
468 | // cliecked on TAB to go to setup | 467 | // cliecked on TAB to go to setup |
469 | void EditConnection::SLOT_AlterTab( const QString & S ) { | 468 | void EditConnection::SLOT_AlterTab( const QString & S ) { |
470 | if( S == tr( "Setup" ) && Setup_FRM->isEnabled() ) { | 469 | if( S == tr( "Setup" ) && Setup_FRM->isEnabled() ) { |
471 | // switched to setup -> update CB and populate ws with | 470 | // switched to setup -> update CB and populate ws with |
472 | // forms for devices | 471 | // forms for devices |
473 | 472 | ||
474 | if( ! TmpIsValid ) { | 473 | if( ! TmpIsValid ) { |
475 | getTmpCollection(); | 474 | getTmpCollection(); |
476 | 475 | ||
477 | // clear CB and Ws | 476 | // clear CB and Ws |
478 | { QWidget * W; | 477 | { QWidget * W; |
479 | int i = 0; | 478 | int i = 0; |
480 | 479 | ||
481 | Devices_CB->clear(); | 480 | Devices_CB->clear(); |
482 | while( ( W = Setup_WS->widget( i ) ) ) { | 481 | while( ( W = Setup_WS->widget( i ) ) ) { |
483 | Setup_WS->removeWidget( W ); | 482 | Setup_WS->removeWidget( W ); |
484 | i ++; | 483 | i ++; |
485 | } | 484 | } |
486 | } | 485 | } |
487 | 486 | ||
488 | // update CB | 487 | // update CB |
489 | // and populate WidgetStack | 488 | // and populate WidgetStack |
490 | { ANetNodeInstance * NNI; | 489 | { ANetNodeInstance * NNI; |
491 | QListIterator<ANetNodeInstance> it(TmpCollection); | 490 | QListIterator<ANetNodeInstance> it(TmpCollection); |
492 | int i = 0; | 491 | int i = 0; |
493 | QWidget * W; | 492 | QWidget * W; |
494 | 493 | ||
495 | for ( ; it.current(); ++it ) { | 494 | for ( ; it.current(); ++it ) { |
496 | NNI = it.current(); | 495 | NNI = it.current(); |
497 | Devices_CB->insertItem( | 496 | Devices_CB->insertItem( |
498 | NSResources->getPixmap( NNI->nodeClass()->pixmapName() ), | 497 | NSResources->getPixmap( NNI->nodeClass()->pixmapName() ), |
499 | NNI->nodeClass()->name() | 498 | NNI->nodeClass()->name() |
500 | ); | 499 | ); |
501 | 500 | ||
502 | // add edit widget | 501 | // add edit widget |
503 | W = NNI->edit( Setup_WS ); | 502 | W = NNI->edit( Setup_WS ); |
504 | if( ! W) { | 503 | if( ! W) { |
505 | W = new QLabel( Setup_WS, | 504 | W = new QLabel( Setup_WS, |
506 | tr("No configuration required")); | 505 | tr("No configuration required")); |
507 | } | 506 | } |
508 | Setup_WS->addWidget( W , i ); | 507 | Setup_WS->addWidget( W , i ); |
509 | i ++; | 508 | i ++; |
510 | } | 509 | } |
511 | } | 510 | } |
512 | Setup_WS->raiseWidget( 0 ); | 511 | Setup_WS->raiseWidget( 0 ); |
513 | } // still valid | 512 | } // still valid |
514 | } | 513 | } |
515 | } | 514 | } |
516 | 515 | ||
517 | // update visual feedback of selection state | 516 | // update visual feedback of selection state |
518 | void EditConnection::updateGUI( QListViewItem * it, ANetNode * NN ) { | 517 | void EditConnection::updateGUI( QListViewItem * it, ANetNode * NN ) { |
519 | 518 | ||
520 | bool HCC = haveCompleteConfig( it ); | 519 | bool HCC = haveCompleteConfig( it ); |
521 | Tab_TB->setTabEnabled( Setup_FRM, HCC ); | 520 | Tab_TB->setTabEnabled( Setup_FRM, HCC ); |
522 | Setup_FRM->setEnabled( HCC ); | 521 | Setup_FRM->setEnabled( HCC ); |
523 | 522 | ||
524 | // disable children of all siblings at same level | 523 | // disable children of all siblings at same level |
525 | QListViewItem * Sbl = it->parent()->firstChild(); | 524 | QListViewItem * Sbl = it->parent()->firstChild(); |
526 | while( Sbl ) { | 525 | while( Sbl ) { |
527 | if ( Sbl != it ) { | 526 | if ( Sbl != it ) { |
528 | disableTree( Sbl->firstChild(), FALSE ); | 527 | disableTree( Sbl->firstChild(), FALSE ); |
529 | Sbl->setSelectable( TRUE ); | 528 | Sbl->setSelectable( TRUE ); |
530 | if( AutoCollapse ) | 529 | if( AutoCollapse ) |
531 | Sbl->setOpen( FALSE ); | 530 | Sbl->setOpen( FALSE ); |
532 | } | 531 | } |
533 | Sbl = Sbl->nextSibling(); | 532 | Sbl = Sbl->nextSibling(); |
534 | } | 533 | } |
535 | 534 | ||
536 | // enable selected path (as deep as it goes | 535 | // enable selected path (as deep as it goes |
537 | it->setOpen( TRUE ); | 536 | it->setOpen( TRUE ); |
538 | enablePath( it->firstChild(), | 537 | enablePath( it->firstChild(), |
539 | (it->depth()==1) ? | 538 | (it->depth()==1) ? |
540 | 1 : // toplevel always alternatives | 539 | 1 : // toplevel always alternatives |
541 | (NN->alternatives().size() > 1) ); | 540 | (NN->alternatives().size() > 1) ); |
542 | } | 541 | } |
543 | 542 | ||
544 | void EditConnection::disableTree( QListViewItem * it, bool Mode ) { | 543 | void EditConnection::disableTree( QListViewItem * it, bool Mode ) { |
545 | while( it ) { | 544 | while( it ) { |
546 | // disable sbl's chidren | 545 | // disable sbl's chidren |
547 | it->setSelectable( Mode ); | 546 | it->setSelectable( Mode ); |
548 | if( AutoCollapse ) | 547 | if( AutoCollapse ) |
549 | it->setOpen( Mode ); | 548 | it->setOpen( Mode ); |
550 | disableTree( it->firstChild(), Mode ); | 549 | disableTree( it->firstChild(), Mode ); |
551 | it = it->nextSibling(); | 550 | it = it->nextSibling(); |
552 | } | 551 | } |
553 | } | 552 | } |
554 | 553 | ||
555 | // pah : ParentHasAlternatives | 554 | // pah : ParentHasAlternatives |
556 | void EditConnection::enablePath( QListViewItem * it, bool pha ) { | 555 | void EditConnection::enablePath( QListViewItem * it, bool pha ) { |
557 | while( it ) { | 556 | while( it ) { |
558 | ANetNode * NN; | 557 | ANetNode * NN; |
559 | NN = (*Mapping)[it]; | 558 | NN = (*Mapping)[it]; |
560 | if( NN ) { | 559 | if( NN ) { |
561 | if( pha ) { | 560 | if( pha ) { |
562 | bool doOn = ((QCheckListItem *)it)->isOn(); | 561 | bool doOn = ((QCheckListItem *)it)->isOn(); |
563 | // we are a checklistitem for sure | 562 | // we are a checklistitem for sure |
564 | it->setSelectable( TRUE ); | 563 | it->setSelectable( TRUE ); |
565 | if( AutoCollapse && ! doOn ) | 564 | if( AutoCollapse && ! doOn ) |
566 | it->setOpen( doOn ); | 565 | it->setOpen( doOn ); |
567 | if( doOn ) { | 566 | if( doOn ) { |
568 | // selected alternative | 567 | // selected alternative |
569 | enablePath( it->firstChild(), | 568 | enablePath( it->firstChild(), |
570 | NN->alternatives().size() > 1); | 569 | NN->alternatives().size() > 1); |
571 | } else { | 570 | } else { |
572 | // non-selected alternative | 571 | // non-selected alternative |
573 | disableTree( it->firstChild(), FALSE); | 572 | disableTree( it->firstChild(), FALSE); |
574 | } | 573 | } |
575 | } else { | 574 | } else { |
576 | // we are single subitem | 575 | // we are single subitem |
577 | it->setSelectable( TRUE ); | 576 | it->setSelectable( TRUE ); |
578 | it->setOpen( TRUE ); | 577 | it->setOpen( TRUE ); |
579 | enablePath( it->firstChild(), | 578 | enablePath( it->firstChild(), |
580 | NN->alternatives().size() > 1); | 579 | NN->alternatives().size() > 1); |
581 | } | 580 | } |
582 | } else { | 581 | } else { |
583 | // controller node | 582 | // controller node |
584 | it->setSelectable( TRUE ); | 583 | it->setSelectable( TRUE ); |
585 | it->setOpen( TRUE ); | 584 | it->setOpen( TRUE ); |
586 | enablePath( it->firstChild(), pha ); | 585 | enablePath( it->firstChild(), pha ); |
587 | } | 586 | } |
588 | it = it->nextSibling(); | 587 | it = it->nextSibling(); |
589 | } | 588 | } |
590 | } | 589 | } |
591 | 590 | ||
592 | // do we have a complete configuration (all needs are provided for ?) | 591 | // do we have a complete configuration (all needs are provided for ?) |
593 | bool EditConnection::haveCompleteConfig( QListViewItem * it ) { | 592 | bool EditConnection::haveCompleteConfig( QListViewItem * it ) { |
594 | 593 | ||
595 | // check if all below this level is selected | 594 | // check if all below this level is selected |
596 | it = ( it ) ?it : Nodes_LV->firstChild(); | 595 | it = ( it ) ?it : Nodes_LV->firstChild(); |
597 | ANetNode *NN; | 596 | ANetNode *NN; |
598 | bool Found; | 597 | bool Found; |
599 | 598 | ||
600 | while ( it ) { | 599 | while ( it ) { |
601 | NN = (*Mapping)[it]; | 600 | NN = (*Mapping)[it]; |
602 | if( NN == 0 ) { | 601 | if( NN == 0 ) { |
603 | // this item is a controller -> | 602 | // this item is a controller -> |
604 | // has radio items as children -> | 603 | // has radio items as children -> |
605 | // find selected one | 604 | // find selected one |
606 | it = it->firstChild(); | 605 | it = it->firstChild(); |
607 | Found = 0; | 606 | Found = 0; |
608 | while( it ) { | 607 | while( it ) { |
609 | if( ((QCheckListItem *)it)->isOn() ) { | 608 | if( ((QCheckListItem *)it)->isOn() ) { |
610 | Found = 1; | 609 | Found = 1; |
611 | // go deeper | 610 | // go deeper |
612 | it = it->firstChild(); | 611 | it = it->firstChild(); |
613 | break; | 612 | break; |
614 | } | 613 | } |
615 | it = it->nextSibling(); | 614 | it = it->nextSibling(); |
616 | } | 615 | } |
617 | 616 | ||
618 | if( ! Found ) { | 617 | if( ! Found ) { |
619 | return 0; // no not complete -> a radio should have been chkd | 618 | return 0; // no not complete -> a radio should have been chkd |
620 | } | 619 | } |
621 | 620 | ||
622 | // it now contains selected radio | 621 | // it now contains selected radio |
623 | NN = (*Mapping)[it]; | 622 | NN = (*Mapping)[it]; |
624 | } else { | 623 | } else { |
625 | // automatic selection | 624 | // automatic selection |
626 | it = it->firstChild(); | 625 | it = it->firstChild(); |
627 | } | 626 | } |
628 | } | 627 | } |
629 | return 1; | 628 | return 1; |
630 | } | 629 | } |
diff --git a/noncore/settings/networksettings2/gprs/GPRSrun.cpp b/noncore/settings/networksettings2/gprs/GPRSrun.cpp index e842b99..cccc71a 100644 --- a/noncore/settings/networksettings2/gprs/GPRSrun.cpp +++ b/noncore/settings/networksettings2/gprs/GPRSrun.cpp | |||
@@ -1,105 +1,105 @@ | |||
1 | #include <sys/types.h> | 1 | #include <sys/types.h> |
2 | #include <signal.h> | 2 | #include <signal.h> |
3 | #include <errno.h> | 3 | #include <errno.h> |
4 | #include <qdir.h> | 4 | #include <qdir.h> |
5 | #include <system.h> | 5 | #include <system.h> |
6 | #include <resources.h> | 6 | #include <resources.h> |
7 | #include <netnode.h> | 7 | #include <netnode.h> |
8 | #include "GPRSrun.h" | 8 | #include "GPRSrun.h" |
9 | 9 | ||
10 | State_t GPRSRun::detectState( void ) { | 10 | State_t GPRSRun::detectState( void ) { |
11 | 11 | ||
12 | // is pppd still running ? | 12 | // is pppd still running ? |
13 | // is rfcomm still active | 13 | // is rfcomm still active |
14 | NodeCollection * NC = nodeCollection(); | 14 | NodeCollection * NC = nodeCollection(); |
15 | InterfaceInfo * I = NC->assignedInterface(); | 15 | InterfaceInfo * I = NC->assignedInterface(); |
16 | 16 | ||
17 | QDir D("/var/run"); | 17 | QDir D("/var/run"); |
18 | 18 | ||
19 | if( I ) { | 19 | if( I ) { |
20 | // has some pppx attached | 20 | // has some pppx attached |
21 | return ( I->IsUp ) ? IsUp : Available; | 21 | return ( I->IsUp ) ? IsUp : Available; |
22 | } | 22 | } |
23 | 23 | ||
24 | // check ppp itself and figure out interface | 24 | // check ppp itself and figure out interface |
25 | 25 | ||
26 | owarn << "Check for ppp " << NC->name() << oendl; | 26 | odebug << "Check for ppp " << NC->name() << oendl; |
27 | if( D.exists( QString("ppp-")+removeSpaces(NC->name())+".pid") ) { | 27 | if( D.exists( QString("ppp-")+removeSpaces(NC->name())+".pid") ) { |
28 | // get pid and check if pppd is still running | 28 | // get pid and check if pppd is still running |
29 | QFile F( D.path()+"/ppp-"+removeSpaces(NC->name())+".pid"); | 29 | QFile F( D.path()+"/ppp-"+removeSpaces(NC->name())+".pid"); |
30 | 30 | ||
31 | owarn << "PPP PID " << F.name() << oendl; | 31 | odebug << "PPP PID " << F.name() << oendl; |
32 | if( F.open( IO_ReadOnly ) ) { | 32 | if( F.open( IO_ReadOnly ) ) { |
33 | QTextStream TS(&F); | 33 | QTextStream TS(&F); |
34 | QString X = TS.readLine(); | 34 | QString X = TS.readLine(); |
35 | PPPPid = X.toULong(); | 35 | PPPPid = X.toULong(); |
36 | int rv; | 36 | int rv; |
37 | 37 | ||
38 | rv = ::kill( PPPPid, 0 ); | 38 | rv = ::kill( PPPPid, 0 ); |
39 | if( rv == 0 || | 39 | if( rv == 0 || |
40 | ( rv < 0 && errno == EPERM ) | 40 | ( rv < 0 && errno == EPERM ) |
41 | ) { | 41 | ) { |
42 | // pppd is still up | 42 | // pppd is still up |
43 | X = TS.readLine(); | 43 | X = TS.readLine(); |
44 | I = NSResources->system().findInterface(X); | 44 | I = NSResources->system().findInterface(X); |
45 | 45 | ||
46 | owarn << "ppp running : IFace " << X << " = " << (long)I << oendl; | 46 | odebug << "ppp running : IFace " << X << " = " << (long)I << oendl; |
47 | 47 | ||
48 | if( I ) { | 48 | if( I ) { |
49 | NC->assignInterface( I ); | 49 | NC->assignInterface( I ); |
50 | return (I->IsUp) ? IsUp : Available; | 50 | return (I->IsUp) ? IsUp : Available; |
51 | } | 51 | } |
52 | 52 | ||
53 | return Available; | 53 | return Available; |
54 | 54 | ||
55 | } else { | 55 | } else { |
56 | // pppd is down | 56 | // pppd is down |
57 | PPPPid = 0; | 57 | PPPPid = 0; |
58 | } | 58 | } |
59 | } // else pppd is down | 59 | } // else pppd is down |
60 | } | 60 | } |
61 | NC->assignInterface( 0 ); | 61 | NC->assignInterface( 0 ); |
62 | return Unknown; | 62 | return Unknown; |
63 | } | 63 | } |
64 | 64 | ||
65 | QString GPRSRun::setMyState( NodeCollection * NC, Action_t A , bool ) { | 65 | QString GPRSRun::setMyState( NodeCollection * NC, Action_t A , bool ) { |
66 | 66 | ||
67 | if( A == Up ) { | 67 | if( A == Up ) { |
68 | // start ppp on deviceFile | 68 | // start ppp on deviceFile |
69 | QStringList SL; | 69 | QStringList SL; |
70 | SL << "pon" | 70 | SL << "pon" |
71 | << removeSpaces( NC->name() ) | 71 | << removeSpaces( NC->name() ) |
72 | << NC->device()->deviceFile(); | 72 | << NC->device()->deviceFile(); |
73 | 73 | ||
74 | if( ! NSResources->system().execAsUser( SL ) ) { | 74 | if( ! NSResources->system().execAsUser( SL ) ) { |
75 | return QString("Cannot start pppd for %1").arg(NC->name()); | 75 | return QString("Cannot start pppd for %1").arg(NC->name()); |
76 | } | 76 | } |
77 | } else if ( A == Down ) { | 77 | } else if ( A == Down ) { |
78 | if( PPPPid == 0 ) { | 78 | if( PPPPid == 0 ) { |
79 | detectState(); | 79 | detectState(); |
80 | } | 80 | } |
81 | if( PPPPid ) { | 81 | if( PPPPid ) { |
82 | QStringList SL; | 82 | QStringList SL; |
83 | 83 | ||
84 | SL << "poff" | 84 | SL << "poff" |
85 | << removeSpaces( NC->name() ); | 85 | << removeSpaces( NC->name() ); |
86 | 86 | ||
87 | if( ! NSResources->system().execAsUser( SL ) ) { | 87 | if( ! NSResources->system().execAsUser( SL ) ) { |
88 | return QString("Cannot terminate pppd for %1").arg(NC->name()); | 88 | return QString("Cannot terminate pppd for %1").arg(NC->name()); |
89 | } | 89 | } |
90 | NC->assignInterface( 0 ); | 90 | NC->assignInterface( 0 ); |
91 | owarn << "ppp stopped " << oendl; | 91 | odebug << "ppp stopped " << oendl; |
92 | PPPPid = 0; | 92 | PPPPid = 0; |
93 | } | 93 | } |
94 | } | 94 | } |
95 | 95 | ||
96 | return QString(); | 96 | return QString(); |
97 | } | 97 | } |
98 | 98 | ||
99 | bool GPRSRun::handlesInterface( const QString & S ) { | 99 | bool GPRSRun::handlesInterface( const QString & S ) { |
100 | return Pat.match( S ) >= 0; | 100 | return Pat.match( S ) >= 0; |
101 | } | 101 | } |
102 | 102 | ||
103 | bool GPRSRun::handlesInterface( InterfaceInfo * I ) { | 103 | bool GPRSRun::handlesInterface( InterfaceInfo * I ) { |
104 | return handlesInterface( I->Name ); | 104 | return handlesInterface( I->Name ); |
105 | } | 105 | } |
diff --git a/noncore/settings/networksettings2/network/networkrun.cpp b/noncore/settings/networksettings2/network/networkrun.cpp index c17aa7f..2c93d9d 100644 --- a/noncore/settings/networksettings2/network/networkrun.cpp +++ b/noncore/settings/networksettings2/network/networkrun.cpp | |||
@@ -1,51 +1,50 @@ | |||
1 | #include <system.h> | 1 | #include <system.h> |
2 | #include <netnode.h> | 2 | #include <netnode.h> |
3 | #include <resources.h> | 3 | #include <resources.h> |
4 | #include "networkrun.h" | 4 | #include "networkrun.h" |
5 | 5 | ||
6 | State_t NetworkRun::detectState( void ) { | 6 | State_t NetworkRun::detectState( void ) { |
7 | InterfaceInfo * II = nodeCollection()->assignedInterface(); | 7 | InterfaceInfo * II = nodeCollection()->assignedInterface(); |
8 | 8 | ||
9 | Log(( "Interface %p : %d\n", II, (II) ? II->IsUp : 0 )); | 9 | Log(( "Interface %p : %d\n", II, (II) ? II->IsUp : 0 )); |
10 | if( II && II->IsUp ) { | 10 | if( II && II->IsUp ) { |
11 | // device has assigned interface | 11 | // device has assigned interface |
12 | return IsUp; | 12 | return IsUp; |
13 | } | 13 | } |
14 | 14 | ||
15 | // had no interface or interface is no longer up -> release | 15 | // had no interface or interface is no longer up -> release |
16 | nodeCollection()->assignInterface( 0 ); | 16 | nodeCollection()->assignInterface( 0 ); |
17 | 17 | ||
18 | return Unknown; | 18 | return Unknown; |
19 | } | 19 | } |
20 | 20 | ||
21 | QString NetworkRun::setMyState( NodeCollection * NC, Action_t A, bool ) { | 21 | QString NetworkRun::setMyState( NodeCollection * NC, Action_t A, bool ) { |
22 | // we handle UP and DOWN | 22 | // we handle UP and DOWN |
23 | InterfaceInfo * II = NC->assignedInterface(); | 23 | InterfaceInfo * II = NC->assignedInterface(); |
24 | 24 | ||
25 | if( ! II ) { | ||
26 | Log(( "no interface assigned." )); | ||
27 | return QString(); | ||
28 | } | ||
29 | |||
30 | QStringList SL; | ||
31 | |||
25 | if( A == Up ) { | 32 | if( A == Up ) { |
26 | // we can bring UP if lower level is available | 33 | // we can bring UP if lower level is available |
27 | QStringList SL; | 34 | SL << "ifup"; |
28 | SL << "ifup" | 35 | } else if( A == Down ) { |
29 | << QString().sprintf( "%s=%s-c%d-allowed", | 36 | SL << "ifdown"; |
37 | } else { | ||
38 | return QString(); | ||
39 | } | ||
40 | |||
41 | SL << QString().sprintf( "%s=%s-c%d-allowed", | ||
30 | II->Name.latin1(), II->Name.latin1(), | 42 | II->Name.latin1(), II->Name.latin1(), |
31 | nodeCollection()->number() ); | 43 | nodeCollection()->number() ); |
32 | if( ! NSResources->system().runAsRoot( SL ) ) { | 44 | |
33 | return QString("Cannot call %1").arg(SL.join(" ")); | 45 | if( ! NSResources->system().runAsRoot( SL ) ) { |
34 | } | 46 | return QString("Cannot call %1").arg(SL.join(" ")); |
35 | return QString(); | 47 | } |
36 | } | 48 | |
37 | |||
38 | if( A == Down ) { | ||
39 | QStringList SL; | ||
40 | if( II ) { | ||
41 | SL << "ifdown" | ||
42 | << II->Name.latin1(); | ||
43 | if( ! NSResources->system().runAsRoot( SL ) ) { | ||
44 | return QString( "Cannot call %1" ).arg( SL.join( " " )); | ||
45 | } | ||
46 | } else { | ||
47 | Log(( "no interface assigned." )); | ||
48 | } | ||
49 | } | ||
50 | return QString(); | 49 | return QString(); |
51 | } | 50 | } |
diff --git a/noncore/settings/networksettings2/networksettings.cpp b/noncore/settings/networksettings2/networksettings.cpp index 9680a96..78b6cce 100644 --- a/noncore/settings/networksettings2/networksettings.cpp +++ b/noncore/settings/networksettings2/networksettings.cpp | |||
@@ -1,514 +1,510 @@ | |||
1 | #include <stdio.h> | 1 | #include <stdio.h> |
2 | #include <unistd.h> | 2 | #include <unistd.h> |
3 | #include <errno.h> | 3 | #include <errno.h> |
4 | 4 | ||
5 | #include <opie2/odebug.h> | 5 | #include <opie2/odebug.h> |
6 | #include <opie2/oledbox.h> | 6 | #include <opie2/oledbox.h> |
7 | 7 | ||
8 | #include <qpe/qpeapplication.h> | 8 | #include <qpe/qpeapplication.h> |
9 | #include <qlistbox.h> | 9 | #include <qlistbox.h> |
10 | #include <qlayout.h> | 10 | #include <qlayout.h> |
11 | #include <qgroupbox.h> | 11 | #include <qgroupbox.h> |
12 | #include <qtimer.h> | 12 | #include <qtimer.h> |
13 | #include <qlistbox.h> | 13 | #include <qlistbox.h> |
14 | #include <qmessagebox.h> | 14 | #include <qmessagebox.h> |
15 | #include <qlabel.h> | 15 | #include <qlabel.h> |
16 | #include <qiconview.h> | 16 | #include <qiconview.h> |
17 | #include <qtimer.h> | 17 | #include <qtimer.h> |
18 | #include <qpe/qpeapplication.h> | 18 | #include <qpe/qpeapplication.h> |
19 | #include <qtoolbutton.h> | 19 | #include <qtoolbutton.h> |
20 | #include <qevent.h> | 20 | #include <qevent.h> |
21 | 21 | ||
22 | #include "networksettings.h" | 22 | #include "networksettings.h" |
23 | #include "netnode.h" | 23 | #include "netnode.h" |
24 | #include "editconnection.h" | 24 | #include "editconnection.h" |
25 | 25 | ||
26 | NetworkSettings::NetworkSettings( QWidget *parent, | 26 | NetworkSettings::NetworkSettings( QWidget *parent, |
27 | const char *name, | 27 | const char *name, |
28 | WFlags fl ) : NetworkSettingsGUI(parent,name,fl), | 28 | WFlags fl ) : NetworkSettingsGUI(parent,name,fl), |
29 | NSD() { | 29 | NSD() { |
30 | 30 | ||
31 | UpdateTimer = new QTimer( this ); | 31 | UpdateTimer = new QTimer( this ); |
32 | 32 | ||
33 | // set pixmaps | 33 | // set pixmaps |
34 | Add_TB->setPixmap( NSResources->getPixmap( "add" ) ); | 34 | Add_TB->setPixmap( NSResources->getPixmap( "add" ) ); |
35 | Delete_TB->setPixmap( NSResources->getPixmap( "remove" ) ); | 35 | Delete_TB->setPixmap( NSResources->getPixmap( "remove" ) ); |
36 | CheckState_TB->setPixmap( NSResources->getPixmap( "check" ) ); | 36 | CheckState_TB->setPixmap( NSResources->getPixmap( "check" ) ); |
37 | GenConfig_TB->setPixmap( NSResources->getPixmap( "configure" ) ); | 37 | GenConfig_TB->setPixmap( NSResources->getPixmap( "configure" ) ); |
38 | 38 | ||
39 | Disable_TB->setPixmap( NSResources->getPixmap( "disabled" ) ); | 39 | Disable_TB->setPixmap( NSResources->getPixmap( "disabled" ) ); |
40 | Up_TB->setPixmap( NSResources->getPixmap( "more" ) ); | 40 | Up_TB->setPixmap( NSResources->getPixmap( "more" ) ); |
41 | Down_TB->setPixmap( NSResources->getPixmap( "less" ) ); | 41 | Down_TB->setPixmap( NSResources->getPixmap( "less" ) ); |
42 | 42 | ||
43 | QVBoxLayout* V = new QVBoxLayout( LED_Frm ); | 43 | QVBoxLayout* V = new QVBoxLayout( LED_Frm ); |
44 | QHBoxLayout * H = new QHBoxLayout( 0 ); | 44 | QHBoxLayout * H = new QHBoxLayout( 0 ); |
45 | V->addStretch(1); | 45 | V->addStretch(1); |
46 | V->addLayout( H ); | 46 | V->addLayout( H ); |
47 | Leds[0] = new Opie::Ui::OLedBox( red, LED_Frm ); | 47 | Leds[0] = new Opie::Ui::OLedBox( red, LED_Frm ); |
48 | H->addWidget( Leds[0], 0, Qt::AlignVCenter ); | 48 | H->addWidget( Leds[0], 0, Qt::AlignVCenter ); |
49 | Leds[1] = new Opie::Ui::OLedBox( red, LED_Frm ); | 49 | Leds[1] = new Opie::Ui::OLedBox( red, LED_Frm ); |
50 | H->addWidget( Leds[1], 0, Qt::AlignVCenter ); | 50 | H->addWidget( Leds[1], 0, Qt::AlignVCenter ); |
51 | Leds[2] = new Opie::Ui::OLedBox( red, LED_Frm ); | 51 | Leds[2] = new Opie::Ui::OLedBox( red, LED_Frm ); |
52 | H->addWidget( Leds[2], 0, Qt::AlignVCenter ); | 52 | H->addWidget( Leds[2], 0, Qt::AlignVCenter ); |
53 | V->addStretch(1); | 53 | V->addStretch(1); |
54 | 54 | ||
55 | 55 | ||
56 | SLOT_ToProfile(); | 56 | SLOT_ToProfile(); |
57 | 57 | ||
58 | // populate main Listbox | 58 | // populate main Listbox |
59 | Profiles_LB->clear(); | 59 | Profiles_LB->clear(); |
60 | QPEApplication::setStylusOperation( | 60 | QPEApplication::setStylusOperation( |
61 | Profiles_LB->viewport(), QPEApplication::RightOnHold ); | 61 | Profiles_LB->viewport(), QPEApplication::RightOnHold ); |
62 | 62 | ||
63 | connect( Profiles_LB, | 63 | connect( Profiles_LB, |
64 | SIGNAL(rightButtonPressed(QListBoxItem*,const QPoint&)), | 64 | SIGNAL(rightButtonPressed(QListBoxItem*,const QPoint&)), |
65 | this, SLOT(SLOT_EditNode(QListBoxItem*)) ); | 65 | this, SLOT(SLOT_EditNode(QListBoxItem*)) ); |
66 | 66 | ||
67 | { Name2Connection_t & M = NSResources->connections(); | 67 | { Name2Connection_t & M = NSResources->connections(); |
68 | NodeCollection * NC; | 68 | NodeCollection * NC; |
69 | // for all connections | 69 | // for all connections |
70 | for( QDictIterator<NodeCollection> it(M); | 70 | for( QDictIterator<NodeCollection> it(M); |
71 | it.current(); | 71 | it.current(); |
72 | ++it ) { | 72 | ++it ) { |
73 | NC = it.current(); | 73 | NC = it.current(); |
74 | Profiles_LB->insertItem( NC->devicePixmap(), | 74 | Profiles_LB->insertItem( NC->devicePixmap(), |
75 | NC->name() ); | 75 | NC->name() ); |
76 | } | 76 | } |
77 | } | 77 | } |
78 | 78 | ||
79 | if( Profiles_LB->count() ) { | 79 | if( Profiles_LB->count() ) { |
80 | Profiles_LB->setSelected( 0, TRUE ); | 80 | Profiles_LB->setSelected( 0, TRUE ); |
81 | } | 81 | } |
82 | 82 | ||
83 | // if no profiles -> auto popup editing | 83 | // if no profiles -> auto popup editing |
84 | if( NSResources->connections().count() == 0 ) { | 84 | if( NSResources->connections().count() == 0 ) { |
85 | QTimer::singleShot( 100, this, SLOT(SLOT_AddNode() ) ); | 85 | QTimer::singleShot( 100, this, SLOT(SLOT_AddNode() ) ); |
86 | } | 86 | } |
87 | 87 | ||
88 | connect( &(NSResources->system()), | 88 | connect( &(NSResources->system()), |
89 | SIGNAL( stdoutLine(const QString &) ), | 89 | SIGNAL( stdoutLine(const QString &) ), |
90 | this, SLOT( SLOT_CmdMessage(const QString &) ) ); | 90 | this, SLOT( SLOT_CmdMessage(const QString &) ) ); |
91 | 91 | ||
92 | connect( &(NSResources->system()), | 92 | connect( &(NSResources->system()), |
93 | SIGNAL( stderrLine(const QString &) ), | 93 | SIGNAL( stderrLine(const QString &) ), |
94 | this, SLOT( SLOT_CmdMessage(const QString &) ) ); | 94 | this, SLOT( SLOT_CmdMessage(const QString &) ) ); |
95 | 95 | ||
96 | connect( &(NSResources->system()), | 96 | connect( &(NSResources->system()), |
97 | SIGNAL( processEvent(const QString &) ), | 97 | SIGNAL( processEvent(const QString &) ), |
98 | this, SLOT( SLOT_CmdMessage(const QString &) ) ); | 98 | this, SLOT( SLOT_CmdMessage(const QString &) ) ); |
99 | 99 | ||
100 | UpdateTimer->start( 5000 ); | 100 | UpdateTimer->start( 5000 ); |
101 | connect( UpdateTimer, SIGNAL( timeout() ), | 101 | connect( UpdateTimer, SIGNAL( timeout() ), |
102 | this, SLOT( SLOT_RefreshStates() ) ); | 102 | this, SLOT( SLOT_RefreshStates() ) ); |
103 | 103 | ||
104 | /* Add QCopChannel */ | 104 | /* Add QCopChannel */ |
105 | connect( qApp, SIGNAL(appMessage(const QCString&,const QByteArray&)), | 105 | connect( qApp, SIGNAL(appMessage(const QCString&,const QByteArray&)), |
106 | this, SLOT(SLOT_QCopMessage(const QCString&,const QByteArray&)) ); | 106 | this, SLOT(SLOT_QCopMessage(const QCString&,const QByteArray&)) ); |
107 | } | 107 | } |
108 | 108 | ||
109 | NetworkSettings::~NetworkSettings() { | 109 | NetworkSettings::~NetworkSettings() { |
110 | QString S; | 110 | QString S; |
111 | 111 | ||
112 | owarn << "Dispose NS" << oendl; | ||
113 | if( NSD.isModified() ) { | 112 | if( NSD.isModified() ) { |
114 | owarn << "Modified" << oendl; | ||
115 | S = NSD.saveSettings(); | 113 | S = NSD.saveSettings(); |
116 | if( ! S.isEmpty() ) { | 114 | if( ! S.isEmpty() ) { |
117 | S.insert( 0, "<p>" ); | 115 | S.insert( 0, "<p>" ); |
118 | S.append( "</p>" ); | 116 | S.append( "</p>" ); |
119 | // problem saving | 117 | // problem saving |
120 | QMessageBox::warning( | 118 | QMessageBox::warning( |
121 | 0, | 119 | 0, |
122 | tr( "Saving setup" ), S ); | 120 | tr( "Saving setup" ), S ); |
123 | } | 121 | } |
124 | 122 | ||
125 | SLOT_GenerateConfig(); | 123 | SLOT_GenerateConfig(); |
126 | NSD.setModified( 0 ); | 124 | NSD.setModified( 0 ); |
127 | } | 125 | } |
128 | 126 | ||
129 | } | 127 | } |
130 | 128 | ||
131 | void NetworkSettings::SLOT_CmdMessage( const QString & S ) { | 129 | void NetworkSettings::SLOT_CmdMessage( const QString & S ) { |
132 | Messages_LB->insertItem( S ); | 130 | Messages_LB->insertItem( S ); |
133 | Messages_LB->setCurrentItem( Messages_LB->count()-1 ); | 131 | Messages_LB->setCurrentItem( Messages_LB->count()-1 ); |
134 | Messages_LB->ensureCurrentVisible(); | 132 | Messages_LB->ensureCurrentVisible(); |
135 | } | 133 | } |
136 | 134 | ||
137 | void NetworkSettings::SLOT_RefreshStates( void ) { | 135 | void NetworkSettings::SLOT_RefreshStates( void ) { |
138 | QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); // remember | 136 | QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); // remember |
139 | 137 | ||
140 | if( LBI ) { | 138 | if( LBI ) { |
141 | NodeCollection * NC; | 139 | NodeCollection * NC; |
142 | NSResources->system().probeInterfaces(); | 140 | NSResources->system().probeInterfaces(); |
143 | // update current selection only | 141 | // update current selection only |
144 | NC = NSResources->findConnection( LBI->text() ); | 142 | NC = NSResources->findConnection( LBI->text() ); |
145 | if( NC ) { | 143 | if( NC ) { |
146 | State_t OldS = NC->state(); | 144 | State_t OldS = NC->state(); |
147 | State_t NewS = NC->state(1); | 145 | State_t NewS = NC->state(1); |
148 | if( OldS != NewS ) { | 146 | if( OldS != NewS ) { |
149 | updateProfileState( LBI ); | 147 | updateProfileState( LBI ); |
150 | } | 148 | } |
151 | } | 149 | } |
152 | } | 150 | } |
153 | 151 | ||
154 | 152 | ||
155 | /* -> LATER !! | 153 | /* -> LATER !! |
156 | bool is; | 154 | bool is; |
157 | NodeCollection * NC; | 155 | NodeCollection * NC; |
158 | 156 | ||
159 | for( unsigned int i = 0; i < Profiles_LB->count() ; i ++ ) { | 157 | for( unsigned int i = 0; i < Profiles_LB->count() ; i ++ ) { |
160 | NC = NSResources->findConnection( Profiles_LB->text(i) ); | 158 | NC = NSResources->findConnection( Profiles_LB->text(i) ); |
161 | if( NC ) { | 159 | if( NC ) { |
162 | State_t OldS = NC->state(); | 160 | State_t OldS = NC->state(); |
163 | State_t NewS = NC->state(1); | 161 | State_t NewS = NC->state(1); |
164 | if( OldS != NewS ) { | 162 | if( OldS != NewS ) { |
165 | is = Profiles_LB->isSelected(i); | 163 | is = Profiles_LB->isSelected(i); |
166 | Profiles_LB->changeItem( NC->statePixmap(NewS), | 164 | Profiles_LB->changeItem( NC->statePixmap(NewS), |
167 | NC->name(), | 165 | NC->name(), |
168 | i ); | 166 | i ); |
169 | if( is ) { | 167 | if( is ) { |
170 | Profiles_LB->setSelected( i, TRUE ); | 168 | Profiles_LB->setSelected( i, TRUE ); |
171 | } | 169 | } |
172 | } | 170 | } |
173 | } | 171 | } |
174 | } | 172 | } |
175 | if( ci >= 0 ) | 173 | if( ci >= 0 ) |
176 | Profiles_LB->setCurrentItem( ci ); | 174 | Profiles_LB->setCurrentItem( ci ); |
177 | */ | 175 | */ |
178 | } | 176 | } |
179 | 177 | ||
180 | void NetworkSettings::SLOT_AddNode( void ) { | 178 | void NetworkSettings::SLOT_AddNode( void ) { |
181 | SLOT_EditNode( 0 ); | 179 | SLOT_EditNode( 0 ); |
182 | } | 180 | } |
183 | 181 | ||
184 | void NetworkSettings::SLOT_DeleteNode( void ) { | 182 | void NetworkSettings::SLOT_DeleteNode( void ) { |
185 | QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); | 183 | QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); |
186 | 184 | ||
187 | if ( ! LBI ) | 185 | if ( ! LBI ) |
188 | return; | 186 | return; |
189 | 187 | ||
190 | if( QMessageBox::warning( | 188 | if( QMessageBox::warning( |
191 | 0, | 189 | 0, |
192 | tr( "Removing profile" ), | 190 | tr( "Removing profile" ), |
193 | tr( "Remove selected profile ?" ), | 191 | tr( "Remove selected profile ?" ), |
194 | 1, 0 ) == 1 ) { | 192 | 1, 0 ) == 1 ) { |
195 | NSResources->removeConnection( LBI->text() ); | 193 | NSResources->removeConnection( LBI->text() ); |
196 | delete LBI; | 194 | delete LBI; |
197 | NSD.setModified( 1 ); | 195 | NSD.setModified( 1 ); |
198 | } | 196 | } |
199 | } | 197 | } |
200 | 198 | ||
201 | void NetworkSettings::SLOT_EditNode( QListBoxItem * LBI ) { | 199 | void NetworkSettings::SLOT_EditNode( QListBoxItem * LBI ) { |
202 | QString OldName = ""; | 200 | QString OldName = ""; |
203 | 201 | ||
204 | EditConnection EC( this ); | 202 | EditConnection EC( this ); |
205 | 203 | ||
206 | if( LBI ) { | 204 | if( LBI ) { |
207 | NodeCollection * NC = NSResources->findConnection( LBI->text() ); | 205 | NodeCollection * NC = NSResources->findConnection( LBI->text() ); |
208 | if( ! NC ) { | 206 | if( ! NC ) { |
209 | return; | 207 | return; |
210 | } | 208 | } |
211 | OldName = NC->name(); | 209 | OldName = NC->name(); |
212 | EC.setConnection( NC ); | 210 | EC.setConnection( NC ); |
213 | } | 211 | } |
214 | 212 | ||
215 | EC.showMaximized(); | 213 | EC.showMaximized(); |
216 | // disable refresh timer | 214 | // disable refresh timer |
217 | UpdateTimer->stop(); | 215 | UpdateTimer->stop(); |
218 | 216 | ||
219 | // we need to retry | 217 | // we need to retry |
220 | while( 1 ) { | 218 | while( 1 ) { |
221 | if( EC.exec() == QDialog::Accepted ) { | 219 | if( EC.exec() == QDialog::Accepted ) { |
222 | // toplevel item -> store | 220 | // toplevel item -> store |
223 | NodeCollection * NC = EC.connection(); | 221 | NodeCollection * NC = EC.connection(); |
224 | if( NC->isModified() ) { | 222 | if( NC->isModified() ) { |
225 | if( LBI ) { | 223 | if( LBI ) { |
226 | if( NC->name() != OldName ) { | 224 | if( NC->name() != OldName ) { |
227 | // find if new name is free | 225 | // find if new name is free |
228 | NodeCollection * LCN = NSResources->findConnection( | 226 | NodeCollection * LCN = NSResources->findConnection( |
229 | NC->name() ); | 227 | NC->name() ); |
230 | if( LCN ) { | 228 | if( LCN ) { |
231 | QMessageBox::warning( | 229 | QMessageBox::warning( |
232 | 0, | 230 | 0, |
233 | tr( "In System Config" ), | 231 | tr( "In System Config" ), |
234 | tr( "Name %1 already exists" ).arg(NC->name()) | 232 | tr( "Name %1 already exists" ).arg(NC->name()) |
235 | ); | 233 | ); |
236 | continue; // restart exec | 234 | continue; // restart exec |
237 | } // else new name | 235 | } // else new name |
238 | // new name -> remove item | 236 | // new name -> remove item |
239 | NSResources->removeConnection( OldName ); | 237 | NSResources->removeConnection( OldName ); |
240 | NSResources->addConnection( NC, 0 ); | 238 | NSResources->addConnection( NC, 0 ); |
241 | } // else not changed | 239 | } // else not changed |
242 | 240 | ||
243 | // must add it here since change will trigger event | 241 | // must add it here since change will trigger event |
244 | Profiles_LB->changeItem( NC->devicePixmap(), | 242 | Profiles_LB->changeItem( NC->devicePixmap(), |
245 | NC->name(), | 243 | NC->name(), |
246 | Profiles_LB->index( LBI ) | 244 | Profiles_LB->index( LBI ) |
247 | ); | 245 | ); |
248 | } else { | 246 | } else { |
249 | // new item | 247 | // new item |
250 | int ci = Profiles_LB->count(); | 248 | int ci = Profiles_LB->count(); |
251 | NSResources->addConnection( NC, 0 ); | 249 | NSResources->addConnection( NC, 0 ); |
252 | NC->setNumber( NSResources->assignConnectionNumber() ); | 250 | NC->setNumber( NSResources->assignConnectionNumber() ); |
253 | Profiles_LB->insertItem( NC->devicePixmap(), NC->name() ); | 251 | Profiles_LB->insertItem( NC->devicePixmap(), NC->name() ); |
254 | Profiles_LB->setSelected( ci, TRUE ); | 252 | Profiles_LB->setSelected( ci, TRUE ); |
255 | } | 253 | } |
256 | updateProfileState( LBI ); | 254 | updateProfileState( LBI ); |
257 | } | 255 | } |
258 | } else { | 256 | } else { |
259 | // cancelled : reset connection | 257 | // cancelled : reset connection |
260 | if( LBI ) { | 258 | if( LBI ) { |
261 | NodeCollection * NC = NSResources->findConnection( LBI->text() ); | 259 | NodeCollection * NC = NSResources->findConnection( LBI->text() ); |
262 | NC->reassign(); | 260 | NC->reassign(); |
263 | } | 261 | } |
264 | } | 262 | } |
265 | break; | 263 | break; |
266 | } | 264 | } |
267 | // reenable | 265 | // reenable |
268 | UpdateTimer->start( 5000 ); | 266 | UpdateTimer->start( 5000 ); |
269 | } | 267 | } |
270 | 268 | ||
271 | void NetworkSettings::SLOT_ShowNode( QListBoxItem * LBI ) { | 269 | void NetworkSettings::SLOT_ShowNode( QListBoxItem * LBI ) { |
272 | if( LBI == 0 ) | 270 | if( LBI == 0 ) |
273 | return; | 271 | return; |
274 | 272 | ||
275 | NodeCollection * NC = NSResources->findConnection( LBI->text() ); | 273 | NodeCollection * NC = NSResources->findConnection( LBI->text() ); |
276 | 274 | ||
277 | if( NC->description().isEmpty() ) { | 275 | if( NC->description().isEmpty() ) { |
278 | Description_LBL->setText( tr( "<<No description>>" ) ); | 276 | Description_LBL->setText( tr( "<<No description>>" ) ); |
279 | } else { | 277 | } else { |
280 | Description_LBL->setText( NC->description() ); | 278 | Description_LBL->setText( NC->description() ); |
281 | } | 279 | } |
282 | 280 | ||
283 | Profile_GB->setTitle( LBI->text() + " : " + NC->stateName() ); | 281 | Profile_GB->setTitle( LBI->text() + " : " + NC->stateName() ); |
284 | 282 | ||
285 | bool FrmActive = 1; | 283 | bool FrmActive = 1; |
286 | bool IsEnabled = 1; | 284 | bool IsEnabled = 1; |
287 | int leds = 0; | 285 | int leds = 0; |
288 | 286 | ||
289 | owarn << "State " << NC->state() << oendl; | ||
290 | switch( NC->state() ) { | 287 | switch( NC->state() ) { |
291 | case Disabled : // no further work | 288 | case Disabled : // no further work |
292 | IsEnabled = 0; | 289 | IsEnabled = 0; |
293 | FrmActive = 0; | 290 | FrmActive = 0; |
294 | owarn << "LEds " << leds << oendl; | ||
295 | break; | 291 | break; |
296 | case Unknown : | 292 | case Unknown : |
297 | case Unchecked : | 293 | case Unchecked : |
298 | case Unavailable : | 294 | case Unavailable : |
299 | FrmActive = 0; | 295 | FrmActive = 0; |
300 | break; | 296 | break; |
301 | case Off : | 297 | case Off : |
302 | leds = 1; | 298 | leds = 1; |
303 | break; | 299 | break; |
304 | case Available : | 300 | case Available : |
305 | leds = 2; | 301 | leds = 2; |
306 | break; | 302 | break; |
307 | case IsUp : | 303 | case IsUp : |
308 | leds = 3; | 304 | leds = 3; |
309 | break; | 305 | break; |
310 | } | 306 | } |
311 | 307 | ||
312 | Disable_TB->setOn( ! IsEnabled ); | 308 | Disable_TB->setOn( ! IsEnabled ); |
313 | LED_Frm->setEnabled( FrmActive ); | 309 | LED_Frm->setEnabled( FrmActive ); |
314 | 310 | ||
315 | for( int i = 0 ; i < leds; i ++ ) { | 311 | for( int i = 0 ; i < leds; i ++ ) { |
316 | Leds[i]->setColor( red ); | 312 | Leds[i]->setColor( red ); |
317 | Leds[i]->setOn( true ); | 313 | Leds[i]->setOn( true ); |
318 | } | 314 | } |
319 | for( int i = leds ; i < 3; i ++ ) { | 315 | for( int i = leds ; i < 3; i ++ ) { |
320 | Leds[i]->setColor( red ); | 316 | Leds[i]->setColor( red ); |
321 | Leds[i]->setOn( false ); | 317 | Leds[i]->setOn( false ); |
322 | } | 318 | } |
323 | 319 | ||
324 | Up_TB->setEnabled( leds < 3 && leds != 0 ); | 320 | Up_TB->setEnabled( leds < 3 && leds != 0 ); |
325 | Down_TB->setEnabled( leds > 0 ); | 321 | Down_TB->setEnabled( leds > 0 ); |
326 | } | 322 | } |
327 | 323 | ||
328 | void NetworkSettings::SLOT_CheckState( void ) { | 324 | void NetworkSettings::SLOT_CheckState( void ) { |
329 | QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); | 325 | QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); |
330 | if ( ! LBI ) | 326 | if ( ! LBI ) |
331 | return; | 327 | return; |
332 | updateProfileState( LBI ); | 328 | updateProfileState( LBI ); |
333 | } | 329 | } |
334 | 330 | ||
335 | void NetworkSettings::updateProfileState( QListBoxItem * LBI ) { | 331 | void NetworkSettings::updateProfileState( QListBoxItem * LBI ) { |
336 | if( LBI == Profiles_LB->item( Profiles_LB->currentItem() ) ) { | 332 | if( LBI == Profiles_LB->item( Profiles_LB->currentItem() ) ) { |
337 | SLOT_ShowNode( LBI ); | 333 | SLOT_ShowNode( LBI ); |
338 | } | 334 | } |
339 | } | 335 | } |
340 | 336 | ||
341 | void NetworkSettings::SLOT_GenerateConfig( void ) { | 337 | void NetworkSettings::SLOT_GenerateConfig( void ) { |
342 | QString S = NSD.generateSettings(); | 338 | QString S = NSD.generateSettings(); |
343 | if( ! S.isEmpty() ) { | 339 | if( ! S.isEmpty() ) { |
344 | S.insert( 0, "<p>" ); | 340 | S.insert( 0, "<p>" ); |
345 | S.append( "</p>" ); | 341 | S.append( "</p>" ); |
346 | QMessageBox::warning( | 342 | QMessageBox::warning( |
347 | 0, | 343 | 0, |
348 | tr( "Generate config" ), | 344 | tr( "Generate config" ), |
349 | S); | 345 | S); |
350 | } | 346 | } |
351 | } | 347 | } |
352 | 348 | ||
353 | void NetworkSettings::SLOT_Disable( bool T ) { | 349 | void NetworkSettings::SLOT_Disable( bool T ) { |
354 | QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); | 350 | QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); |
355 | QString Msg; | 351 | QString Msg; |
356 | 352 | ||
357 | if ( ! LBI ) | 353 | if ( ! LBI ) |
358 | return; | 354 | return; |
359 | 355 | ||
360 | NodeCollection * NC = NSResources->findConnection( LBI->text() ); | 356 | NodeCollection * NC = NSResources->findConnection( LBI->text() ); |
361 | 357 | ||
362 | owarn << "Prepare to disable" << oendl; | 358 | Log(( "Prepare to %sable\n", (T) ? "en" : "dis" )); |
363 | Msg = NC->setState( (T) ? Disable : Enable ); | 359 | Msg = NC->setState( (T) ? Disable : Enable ); |
364 | if( ! Msg.isEmpty() ) { | 360 | if( ! Msg.isEmpty() ) { |
365 | Msg.insert( 0, "<p>" ); | 361 | Msg.insert( 0, "<p>" ); |
366 | Msg.append( "</p>" ); | 362 | Msg.append( "</p>" ); |
367 | QMessageBox::warning( | 363 | QMessageBox::warning( |
368 | 0, | 364 | 0, |
369 | tr( "Activating profile" ), | 365 | tr( "Activating profile" ), |
370 | Msg ); | 366 | Msg ); |
371 | return; | 367 | return; |
372 | } | 368 | } |
373 | 369 | ||
374 | // reload new state | 370 | // reload new state |
375 | NC->state( true ); | 371 | NC->state( true ); |
376 | updateProfileState( LBI ); | 372 | updateProfileState( LBI ); |
377 | } | 373 | } |
378 | 374 | ||
379 | void NetworkSettings::SLOT_Up( void ) { | 375 | void NetworkSettings::SLOT_Up( void ) { |
380 | // bring more up | 376 | // bring more up |
381 | 377 | ||
382 | QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); | 378 | QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); |
383 | QString Msg; | 379 | QString Msg; |
384 | int led = -1; | 380 | int led = -1; |
385 | 381 | ||
386 | if ( ! LBI ) | 382 | if ( ! LBI ) |
387 | return; | 383 | return; |
388 | 384 | ||
389 | NodeCollection * NC = | 385 | NodeCollection * NC = |
390 | NSResources->findConnection( LBI->text() ); | 386 | NSResources->findConnection( LBI->text() ); |
391 | 387 | ||
392 | switch( NC->state() ) { | 388 | switch( NC->state() ) { |
393 | case Disabled : // cannot modify this state | 389 | case Disabled : // cannot modify this state |
394 | case Unknown : // cannot modify this state | 390 | case Unknown : // cannot modify this state |
395 | case Unchecked : // cannot modify this state | 391 | case Unchecked : // cannot modify this state |
396 | case Unavailable : // cannot modify this state | 392 | case Unavailable : // cannot modify this state |
397 | case IsUp : // highest UP state | 393 | case IsUp : // highest UP state |
398 | return; | 394 | return; |
399 | case Off : // -> activate | 395 | case Off : // -> activate |
400 | led = 1; | 396 | led = 1; |
401 | Down_TB->setEnabled( true ); | 397 | Down_TB->setEnabled( true ); |
402 | Log(( "Activate interface %s\n", NC->name().latin1() )); | 398 | Log(( "Activate interface %s\n", NC->name().latin1() )); |
403 | Msg = NC->setState( Activate ); | 399 | Msg = NC->setState( Activate ); |
404 | break; | 400 | break; |
405 | case Available : // -> up | 401 | case Available : // -> up |
406 | led = 2; | 402 | led = 2; |
407 | Log(( "Bring up interface %s\n", NC->name().latin1() )); | 403 | Log(( "Bring up interface %s\n", NC->name().latin1() )); |
408 | Msg = NC->setState( Up ); | 404 | Msg = NC->setState( Up ); |
409 | if( Msg.isEmpty() ) { | 405 | if( Msg.isEmpty() ) { |
410 | Up_TB->setEnabled( false ); | 406 | Up_TB->setEnabled( false ); |
411 | } | 407 | } |
412 | break; | 408 | break; |
413 | } | 409 | } |
414 | 410 | ||
415 | if( ! Msg.isEmpty() ) { | 411 | if( ! Msg.isEmpty() ) { |
416 | Msg.insert( 0, "<p>" ); | 412 | Msg.insert( 0, "<p>" ); |
417 | Msg.append( "</p>" ); | 413 | Msg.append( "</p>" ); |
418 | QMessageBox::warning( | 414 | QMessageBox::warning( |
419 | 0, | 415 | 0, |
420 | tr( "Increase availability" ), | 416 | tr( "Increase availability" ), |
421 | Msg ); | 417 | Msg ); |
422 | return; | 418 | return; |
423 | } | 419 | } |
424 | 420 | ||
425 | updateProfileState( LBI ); | 421 | updateProfileState( LBI ); |
426 | 422 | ||
427 | // set color of led we should change | 423 | // set color of led we should change |
428 | if( led > 0 ) { | 424 | if( led > 0 ) { |
429 | Leds[led]->setColor( blue ); | 425 | Leds[led]->setColor( blue ); |
430 | Leds[led]->setOn( true ); | 426 | Leds[led]->setOn( true ); |
431 | } | 427 | } |
432 | 428 | ||
433 | } | 429 | } |
434 | 430 | ||
435 | void NetworkSettings::SLOT_Down( void ) { | 431 | void NetworkSettings::SLOT_Down( void ) { |
436 | // bring more down | 432 | // bring more down |
437 | 433 | ||
438 | QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); | 434 | QListBoxItem * LBI = Profiles_LB->item( Profiles_LB->currentItem() ); |
439 | int led = -1; | 435 | int led = -1; |
440 | QString Msg; | 436 | QString Msg; |
441 | 437 | ||
442 | if ( ! LBI ) | 438 | if ( ! LBI ) |
443 | return; | 439 | return; |
444 | 440 | ||
445 | NodeCollection * NC = | 441 | NodeCollection * NC = |
446 | NSResources->findConnection( LBI->text() ); | 442 | NSResources->findConnection( LBI->text() ); |
447 | 443 | ||
448 | switch( NC->state() ) { | 444 | switch( NC->state() ) { |
449 | case Disabled : // cannot modify this state | 445 | case Disabled : // cannot modify this state |
450 | case Unknown : // cannot modify this state | 446 | case Unknown : // cannot modify this state |
451 | case Unchecked : // cannot modify this state | 447 | case Unchecked : // cannot modify this state |
452 | case Unavailable : // cannot modify this state | 448 | case Unavailable : // cannot modify this state |
453 | case Off : // highest DOWN state | 449 | case Off : // highest DOWN state |
454 | break; | 450 | break; |
455 | case Available : // -> down | 451 | case Available : // -> down |
456 | led = 0; | 452 | led = 0; |
457 | Log(( "Deactivate interface %s\n", NC->name().latin1() )); | 453 | Log(( "Deactivate interface %s\n", NC->name().latin1() )); |
458 | Msg = NC->setState( Deactivate ); | 454 | Msg = NC->setState( Deactivate ); |
459 | Down_TB->setEnabled( false ); | 455 | Down_TB->setEnabled( false ); |
460 | break; | 456 | break; |
461 | case IsUp : // highest UP state | 457 | case IsUp : // highest UP state |
462 | led = 1; | 458 | led = 1; |
463 | Up_TB->setEnabled( true ); | 459 | Up_TB->setEnabled( true ); |
464 | Log(( "Bring down interface %s\n", NC->name().latin1() )); | 460 | Log(( "Bring down interface %s\n", NC->name().latin1() )); |
465 | Msg = NC->setState( Down, 1 ); | 461 | Msg = NC->setState( Down, 1 ); |
466 | if( Msg.isEmpty() ) { | 462 | if( Msg.isEmpty() ) { |
467 | // remove 'up' file to make sure | 463 | // remove 'up' file to make sure |
468 | unlink ( QString().sprintf( "/tmp/Profile-%d.up", NC->number() ).latin1() );; | 464 | unlink ( QString().sprintf( "/tmp/Profile-%d.up", NC->number() ).latin1() );; |
469 | } | 465 | } |
470 | break; | 466 | break; |
471 | } | 467 | } |
472 | 468 | ||
473 | if( ! Msg.isEmpty() ) { | 469 | if( ! Msg.isEmpty() ) { |
474 | Msg.insert( 0, "<p>" ); | 470 | Msg.insert( 0, "<p>" ); |
475 | Msg.append( "</p>" ); | 471 | Msg.append( "</p>" ); |
476 | QMessageBox::warning( | 472 | QMessageBox::warning( |
477 | 0, | 473 | 0, |
478 | tr( "Decrease availability" ), | 474 | tr( "Decrease availability" ), |
479 | Msg ); | 475 | Msg ); |
480 | return; | 476 | return; |
481 | } | 477 | } |
482 | 478 | ||
483 | updateProfileState( LBI ); | 479 | updateProfileState( LBI ); |
484 | 480 | ||
485 | // set color of led we should change | 481 | // set color of led we should change |
486 | if( led >= 0 ) { | 482 | if( led >= 0 ) { |
487 | Leds[led]->setColor( blue ); | 483 | Leds[led]->setColor( blue ); |
488 | } | 484 | } |
489 | } | 485 | } |
490 | 486 | ||
491 | void NetworkSettings::SLOT_ToMessages( void ) { | 487 | void NetworkSettings::SLOT_ToMessages( void ) { |
492 | Profiles_LB->hide(); | 488 | Profiles_LB->hide(); |
493 | Profile_GB->hide(); | 489 | Profile_GB->hide(); |
494 | Messages_GB->show(); | 490 | Messages_GB->show(); |
495 | } | 491 | } |
496 | 492 | ||
497 | void NetworkSettings::SLOT_ToProfile( void ) { | 493 | void NetworkSettings::SLOT_ToProfile( void ) { |
498 | Profiles_LB->show(); | 494 | Profiles_LB->show(); |
499 | Profile_GB->show(); | 495 | Profile_GB->show(); |
500 | Messages_GB->hide(); | 496 | Messages_GB->hide(); |
501 | } | 497 | } |
502 | 498 | ||
503 | void NetworkSettings::SLOT_QCopMessage(const QCString &msg, const QByteArray &data) { | 499 | void NetworkSettings::SLOT_QCopMessage(const QCString &msg, const QByteArray &data) { |
504 | QDataStream stream( data, IO_ReadOnly ); | 500 | QDataStream stream( data, IO_ReadOnly ); |
505 | 501 | ||
506 | if( msg == "raise" ) { | 502 | if( msg == "raise" ) { |
507 | raise(); | 503 | raise(); |
508 | return; | 504 | return; |
509 | } /* if ( msg == "someMessage(int,int,int)" ) { | 505 | } /* if ( msg == "someMessage(int,int,int)" ) { |
510 | int a,b,c; | 506 | int a,b,c; |
511 | stream >> a >> b >> c; | 507 | stream >> a >> b >> c; |
512 | ... | 508 | ... |
513 | } */ | 509 | } */ |
514 | } | 510 | } |
diff --git a/noncore/settings/networksettings2/networksettings2/config.in b/noncore/settings/networksettings2/networksettings2/config.in index b384e18..56e971e 100644 --- a/noncore/settings/networksettings2/networksettings2/config.in +++ b/noncore/settings/networksettings2/networksettings2/config.in | |||
@@ -1,5 +1,5 @@ | |||
1 | config NS2CORE | 1 | config NS2CORE |
2 | boolean "opie-networksettings2 (TCP/IP network settings)" | 2 | boolean "opie-networksettings2 library" |
3 | default "y" | 3 | default "y" |
4 | depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE && LIBOPIE2UI | 4 | depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE && LIBOPIE2UI |
5 | 5 | ||
diff --git a/noncore/settings/networksettings2/networksettings2/system.cpp b/noncore/settings/networksettings2/networksettings2/system.cpp index e642c08..f027d35 100644 --- a/noncore/settings/networksettings2/networksettings2/system.cpp +++ b/noncore/settings/networksettings2/networksettings2/system.cpp | |||
@@ -1,587 +1,587 @@ | |||
1 | #include <sys/types.h> | 1 | #include <sys/types.h> |
2 | #include <sys/wait.h> | 2 | #include <sys/wait.h> |
3 | 3 | ||
4 | #include <net/if.h> | 4 | #include <net/if.h> |
5 | #include <net/if_arp.h> | 5 | #include <net/if_arp.h> |
6 | #include <netinet/in.h> | 6 | #include <netinet/in.h> |
7 | #include <arpa/inet.h> | 7 | #include <arpa/inet.h> |
8 | #include <sys/ioctl.h> | 8 | #include <sys/ioctl.h> |
9 | #include <sys/socket.h> | 9 | #include <sys/socket.h> |
10 | #include <stdlib.h> | 10 | #include <stdlib.h> |
11 | #include <stdio.h> | 11 | #include <stdio.h> |
12 | #include <fcntl.h> | 12 | #include <fcntl.h> |
13 | #include <errno.h> | 13 | #include <errno.h> |
14 | #include <unistd.h> | 14 | #include <unistd.h> |
15 | 15 | ||
16 | #include <opie2/oprocess.h> | 16 | #include <opie2/oprocess.h> |
17 | 17 | ||
18 | #include <qdir.h> | 18 | #include <qdir.h> |
19 | #include <qregexp.h> | 19 | #include <qregexp.h> |
20 | #include <qstringlist.h> | 20 | #include <qstringlist.h> |
21 | #include <qfile.h> | 21 | #include <qfile.h> |
22 | #include <qtextstream.h> | 22 | #include <qtextstream.h> |
23 | #include <qapplication.h> | 23 | #include <qapplication.h> |
24 | 24 | ||
25 | #include "resources.h" | 25 | #include "resources.h" |
26 | #include "system.h" | 26 | #include "system.h" |
27 | 27 | ||
28 | #define PROCNETDEV "/proc/net/dev" | 28 | #define PROCNETDEV "/proc/net/dev" |
29 | 29 | ||
30 | #ifndef ARPHRD_IEEE80211 | 30 | #ifndef ARPHRD_IEEE80211 |
31 | #define ARPHRD_IEEE80211 801 | 31 | #define ARPHRD_IEEE80211 801 |
32 | #endif | 32 | #endif |
33 | 33 | ||
34 | static char Dig2Hex[] = { | 34 | static char Dig2Hex[] = { |
35 | '0', '1', '2', '3', | 35 | '0', '1', '2', '3', |
36 | '4', '5', '6', '7', | 36 | '4', '5', '6', '7', |
37 | '8', '9', 'A', 'B', | 37 | '8', '9', 'A', 'B', |
38 | 'C', 'D', 'E', 'F' | 38 | 'C', 'D', 'E', 'F' |
39 | }; | 39 | }; |
40 | 40 | ||
41 | // get HIGH nibble of byte | 41 | // get HIGH nibble of byte |
42 | #define HN(x) Dig2Hex[(((x)&0xf0)>>4)] | 42 | #define HN(x) Dig2Hex[(((x)&0xf0)>>4)] |
43 | // get LOW nibble of byte | 43 | // get LOW nibble of byte |
44 | #define LN(x) Dig2Hex[((x)&0x0f)] | 44 | #define LN(x) Dig2Hex[((x)&0x0f)] |
45 | 45 | ||
46 | System::System( void ) : QObject(), ProbedInterfaces() { | 46 | System::System( void ) : QObject(), ProbedInterfaces() { |
47 | ProcDevNet = 0; | 47 | ProcDevNet = 0; |
48 | } | 48 | } |
49 | 49 | ||
50 | System::~System( void ) { | 50 | System::~System( void ) { |
51 | if( ProcDevNet ) | 51 | if( ProcDevNet ) |
52 | delete ProcDevNet; | 52 | delete ProcDevNet; |
53 | } | 53 | } |
54 | 54 | ||
55 | QDict<InterfaceInfo> & System::interfaces( void ) { | 55 | QDict<InterfaceInfo> & System::interfaces( void ) { |
56 | if( ProbedInterfaces.count() == 0 ) { | 56 | if( ProbedInterfaces.count() == 0 ) { |
57 | probeInterfaces(); | 57 | probeInterfaces(); |
58 | } | 58 | } |
59 | return ProbedInterfaces; | 59 | return ProbedInterfaces; |
60 | } | 60 | } |
61 | 61 | ||
62 | int System::runAsRoot( QStringList & S, MyProcess * Prc ) { | 62 | int System::runAsRoot( QStringList & S, MyProcess * Prc ) { |
63 | char * usr = getenv("USER"); | 63 | char * usr = getenv("USER"); |
64 | 64 | ||
65 | if( S.count() == 0 ) { | 65 | if( S.count() == 0 ) { |
66 | // loophole to start shell | 66 | // loophole to start shell |
67 | return 8888; | 67 | return 8888; |
68 | } | 68 | } |
69 | if( usr == 0 || strcmp( usr, "root" ) ) { | 69 | if( usr == 0 || strcmp( usr, "root" ) ) { |
70 | // unknown or non-root user -> use SUDO | 70 | // unknown or non-root user -> use SUDO |
71 | S.prepend( "sudo" ); | 71 | S.prepend( "sudo" ); |
72 | } | 72 | } |
73 | 73 | ||
74 | if( getenv( "NS2TESTMODE" ) ) { | 74 | if( getenv( "NS2TESTMODE" ) ) { |
75 | owarn << "TESTMODE !!! execute " | 75 | odebug << "TESTMODE !!! execute " |
76 | << S.join( " ") | 76 | << S.join( " ") |
77 | << oendl; | 77 | << oendl; |
78 | } else { | 78 | } else { |
79 | MyProcess * P; | 79 | MyProcess * P; |
80 | 80 | ||
81 | if( Prc ) { | 81 | if( Prc ) { |
82 | P = Prc; | 82 | P = Prc; |
83 | } else { | 83 | } else { |
84 | P = new MyProcess(); | 84 | P = new MyProcess(); |
85 | emit processEvent( tr("Command : ") + S.join( " " ) ); | 85 | emit processEvent( tr("Command : ") + S.join( " " ) ); |
86 | 86 | ||
87 | connect( P, | 87 | connect( P, |
88 | SIGNAL( stdoutLine( const QString & ) ), | 88 | SIGNAL( stdoutLine( const QString & ) ), |
89 | this, | 89 | this, |
90 | SIGNAL( stdoutLine( const QString & ) ) ); | 90 | SIGNAL( stdoutLine( const QString & ) ) ); |
91 | 91 | ||
92 | connect( P, | 92 | connect( P, |
93 | SIGNAL( stderrLine( const QString & ) ), | 93 | SIGNAL( stderrLine( const QString & ) ), |
94 | this, | 94 | this, |
95 | SIGNAL( stderrLine( const QString & ) ) ); | 95 | SIGNAL( stderrLine( const QString & ) ) ); |
96 | 96 | ||
97 | connect( P, | 97 | connect( P, |
98 | SIGNAL(processExited(MyProcess*) ), | 98 | SIGNAL(processExited(MyProcess*) ), |
99 | this, SLOT | 99 | this, SLOT |
100 | (SLOT_ProcessExited(MyProcess*) ) ); | 100 | (SLOT_ProcessExited(MyProcess*) ) ); |
101 | } | 101 | } |
102 | 102 | ||
103 | P->process() << S; | 103 | P->process() << S; |
104 | 104 | ||
105 | Log(("Executing %s\n", S.join( " " ).latin1() )); | 105 | Log(("Executing %s\n", S.join( " " ).latin1() )); |
106 | 106 | ||
107 | if( ! P->process().start( OProcess::DontCare, | 107 | if( ! P->process().start( OProcess::DontCare, |
108 | OProcess::AllOutput ) ) { | 108 | OProcess::AllOutput ) ) { |
109 | owarn << "Error starting " << S << oendl; | 109 | odebug << "Error starting " << S << oendl; |
110 | if( ! Prc ) | 110 | if( ! Prc ) |
111 | delete P; | 111 | delete P; |
112 | // error starting app | 112 | // error starting app |
113 | return 0; | 113 | return 0; |
114 | } | 114 | } |
115 | owarn << "Started " << S << oendl; | 115 | odebug << "Started " << S << oendl; |
116 | } | 116 | } |
117 | 117 | ||
118 | // all is fine | 118 | // all is fine |
119 | return 1; | 119 | return 1; |
120 | } | 120 | } |
121 | 121 | ||
122 | int System::execAsUser( QStringList & SL ) { | 122 | int System::execAsUser( QStringList & SL ) { |
123 | MyProcess * P = new MyProcess(); | 123 | MyProcess * P = new MyProcess(); |
124 | CurrentQPEUser CU = NSResources->currentUser(); | 124 | CurrentQPEUser CU = NSResources->currentUser(); |
125 | char * usr = getenv("USER"); | 125 | char * usr = getenv("USER"); |
126 | 126 | ||
127 | if( strcmp( usr, "root" ) == 0 ) { | 127 | if( strcmp( usr, "root" ) == 0 ) { |
128 | // find user running qpe | 128 | // find user running qpe |
129 | if( CU.UserName.isEmpty() ) { | 129 | if( CU.UserName.isEmpty() ) { |
130 | // if we come here, the exec was not successfull | 130 | // if we come here, the exec was not successfull |
131 | Log(("User not known \n" )); | 131 | Log(("User not known \n" )); |
132 | return 0; | 132 | return 0; |
133 | } | 133 | } |
134 | } | 134 | } |
135 | 135 | ||
136 | // now we are ready to exec the requested command | 136 | // now we are ready to exec the requested command |
137 | setuid( CU.Uid ); | 137 | setuid( CU.Uid ); |
138 | setgid( CU.Gid ); | 138 | setgid( CU.Gid ); |
139 | 139 | ||
140 | for( unsigned int i = 0 ; i < CU.EnvList.count() ; i ++ ) { | 140 | for( unsigned int i = 0 ; i < CU.EnvList.count() ; i ++ ) { |
141 | QString X; | 141 | QString X; |
142 | QStringList SL; | 142 | QStringList SL; |
143 | X = CU.EnvList[i]; | 143 | X = CU.EnvList[i]; |
144 | SL = QStringList::split( "=", X ); | 144 | SL = QStringList::split( "=", X ); |
145 | P->process().setEnvironment( SL[0], SL[1] ); | 145 | P->process().setEnvironment( SL[0], SL[1] ); |
146 | } | 146 | } |
147 | 147 | ||
148 | P->process() << SL; | 148 | P->process() << SL; |
149 | 149 | ||
150 | emit processEvent( tr("Command : ") + SL.join( " " ) ); | 150 | emit processEvent( tr("Command : ") + SL.join( " " ) ); |
151 | 151 | ||
152 | Log(("Executing as user %s : %s\n", | 152 | Log(("Executing as user %s : %s\n", |
153 | CU.UserName.latin1(), | 153 | CU.UserName.latin1(), |
154 | SL.join( " " ).latin1() )); | 154 | SL.join( " " ).latin1() )); |
155 | 155 | ||
156 | int rv = ( P->process().start( OProcess::DontCare, | 156 | int rv = ( P->process().start( OProcess::DontCare, |
157 | OProcess::NoCommunication ) ); | 157 | OProcess::NoCommunication ) ); |
158 | delete P; | 158 | delete P; |
159 | 159 | ||
160 | if( rv ) { | 160 | if( rv ) { |
161 | // if we come here, the exec was not successfull | 161 | // if we come here, the exec was not successfull |
162 | Log(("Could not exec : %d\n", errno )); | 162 | Log(("Could not exec : %d\n", errno )); |
163 | } | 163 | } |
164 | 164 | ||
165 | return ! rv; | 165 | return ! rv; |
166 | } | 166 | } |
167 | 167 | ||
168 | void System::SLOT_ProcessExited( MyProcess * P ) { | 168 | void System::SLOT_ProcessExited( MyProcess * P ) { |
169 | QString R; | 169 | QString R; |
170 | 170 | ||
171 | for( QValueListConstIterator<QCString> it = P->process().args().begin(); | 171 | for( QValueListConstIterator<QCString> it = P->process().args().begin(); |
172 | it != P->process().args().end(); | 172 | it != P->process().args().end(); |
173 | ++it ) { | 173 | ++it ) { |
174 | R += (*it); | 174 | R += (*it); |
175 | R += " "; | 175 | R += " "; |
176 | } | 176 | } |
177 | 177 | ||
178 | R += "Returned with " + QString().setNum( P->process().exitStatus() ); | 178 | R += "Returned with " + QString().setNum( P->process().exitStatus() ); |
179 | emit processEvent( R ); | 179 | emit processEvent( R ); |
180 | delete P; | 180 | delete P; |
181 | } | 181 | } |
182 | 182 | ||
183 | void System::refreshStatistics( InterfaceInfo & I ) { | 183 | void System::refreshStatistics( InterfaceInfo & I ) { |
184 | if( ! ProcDevNet ) { | 184 | if( ! ProcDevNet ) { |
185 | return; | 185 | return; |
186 | } | 186 | } |
187 | // cannot seek on dev | 187 | // cannot seek on dev |
188 | ProcDevNet->close(); | 188 | ProcDevNet->close(); |
189 | ProcDevNet->open( IO_ReadOnly ); | 189 | ProcDevNet->open( IO_ReadOnly ); |
190 | 190 | ||
191 | QString line; | 191 | QString line; |
192 | QTextStream procTs(ProcDevNet); | 192 | QTextStream procTs(ProcDevNet); |
193 | QStringList SL; | 193 | QStringList SL; |
194 | int loc = -1; | 194 | int loc = -1; |
195 | int version; | 195 | int version; |
196 | 196 | ||
197 | procTs.readLine(); | 197 | procTs.readLine(); |
198 | line = procTs.readLine(); | 198 | line = procTs.readLine(); |
199 | // get version | 199 | // get version |
200 | if( line.find("compressed") ) | 200 | if( line.find("compressed") ) |
201 | version = 3; | 201 | version = 3; |
202 | else if( line.find( "bytes" ) ) | 202 | else if( line.find( "bytes" ) ) |
203 | version = 2; | 203 | version = 2; |
204 | else | 204 | else |
205 | version = 1; | 205 | version = 1; |
206 | while((line = procTs.readLine().simplifyWhiteSpace()) != QString::null) { | 206 | while((line = procTs.readLine().simplifyWhiteSpace()) != QString::null) { |
207 | if( (loc = line.find(":") ) == -1) { | 207 | if( (loc = line.find(":") ) == -1) { |
208 | continue; | 208 | continue; |
209 | } | 209 | } |
210 | 210 | ||
211 | if( I.Name != line.left(loc) ) | 211 | if( I.Name != line.left(loc) ) |
212 | continue; | 212 | continue; |
213 | 213 | ||
214 | // tokenize | 214 | // tokenize |
215 | SL = QStringList::split( ' ', line, FALSE ); | 215 | SL = QStringList::split( ' ', line, FALSE ); |
216 | 216 | ||
217 | // update data | 217 | // update data |
218 | switch( version ) { | 218 | switch( version ) { |
219 | case 1 : | 219 | case 1 : |
220 | I.RcvBytes = SL[1]; | 220 | I.RcvBytes = SL[1]; |
221 | I.RcvErrors = SL[3]; | 221 | I.RcvErrors = SL[3]; |
222 | I.RcvDropped = SL[4]; | 222 | I.RcvDropped = SL[4]; |
223 | I.SndBytes = SL[6]; | 223 | I.SndBytes = SL[6]; |
224 | I.SndErrors = SL[8]; | 224 | I.SndErrors = SL[8]; |
225 | I.SndDropped = SL[9]; | 225 | I.SndDropped = SL[9]; |
226 | I.Collisions = SL[11]; | 226 | I.Collisions = SL[11]; |
227 | break; | 227 | break; |
228 | case 2 : | 228 | case 2 : |
229 | I.RcvBytes = SL[1]; | 229 | I.RcvBytes = SL[1]; |
230 | I.RcvErrors = SL[3]; | 230 | I.RcvErrors = SL[3]; |
231 | I.RcvDropped = SL[4]; | 231 | I.RcvDropped = SL[4]; |
232 | I.SndBytes = SL[7]; | 232 | I.SndBytes = SL[7]; |
233 | I.SndErrors = SL[9]; | 233 | I.SndErrors = SL[9]; |
234 | I.SndDropped = SL[10]; | 234 | I.SndDropped = SL[10]; |
235 | I.Collisions = SL[12]; | 235 | I.Collisions = SL[12]; |
236 | break; | 236 | break; |
237 | case 3 : | 237 | case 3 : |
238 | I.RcvBytes = SL[1]; | 238 | I.RcvBytes = SL[1]; |
239 | I.RcvErrors = SL[3]; | 239 | I.RcvErrors = SL[3]; |
240 | I.RcvDropped = SL[4]; | 240 | I.RcvDropped = SL[4]; |
241 | I.SndBytes = SL[9]; | 241 | I.SndBytes = SL[9]; |
242 | I.SndErrors = SL[11]; | 242 | I.SndErrors = SL[11]; |
243 | I.SndDropped = SL[12]; | 243 | I.SndDropped = SL[12]; |
244 | I.Collisions = SL[14]; | 244 | I.Collisions = SL[14]; |
245 | break; | 245 | break; |
246 | } | 246 | } |
247 | break; | 247 | break; |
248 | } | 248 | } |
249 | } | 249 | } |
250 | 250 | ||
251 | // | 251 | // |
252 | // THIS UPDATES THE LIST -> INTERFACES ARE NOT DELETED BUT | 252 | // THIS UPDATES THE LIST -> INTERFACES ARE NOT DELETED BUT |
253 | // FLAGGED AS ! 'IsUp' IF NO LONGER PRESENT | 253 | // FLAGGED AS ! 'IsUp' IF NO LONGER PRESENT |
254 | // | 254 | // |
255 | 255 | ||
256 | void System::probeInterfaces( void ) { | 256 | void System::probeInterfaces( void ) { |
257 | 257 | ||
258 | // probe interfaces | 258 | // probe interfaces |
259 | int sockfd; | 259 | int sockfd; |
260 | // get list of all interfaces | 260 | // get list of all interfaces |
261 | struct ifreq ifrs; | 261 | struct ifreq ifrs; |
262 | InterfaceInfo * IFI; | 262 | InterfaceInfo * IFI; |
263 | 263 | ||
264 | // flag all as 'down' | 264 | // flag all as 'down' |
265 | for( QDictIterator<InterfaceInfo> it( ProbedInterfaces ); | 265 | for( QDictIterator<InterfaceInfo> it( ProbedInterfaces ); |
266 | it.current(); | 266 | it.current(); |
267 | ++it ) { | 267 | ++it ) { |
268 | it.current()->IsUp = 0; | 268 | it.current()->IsUp = 0; |
269 | } | 269 | } |
270 | 270 | ||
271 | sockfd = socket(PF_INET, SOCK_DGRAM, 0); | 271 | sockfd = socket(PF_INET, SOCK_DGRAM, 0); |
272 | if(sockfd == -1) { | 272 | if(sockfd == -1) { |
273 | owarn << "Cannot open INET socket " | 273 | odebug << "Cannot open INET socket " |
274 | << errno | 274 | << errno |
275 | << " " | 275 | << " " |
276 | << strerror( errno ) | 276 | << strerror( errno ) |
277 | << oendl; | 277 | << oendl; |
278 | return; | 278 | return; |
279 | } | 279 | } |
280 | 280 | ||
281 | // read interfaces from /proc/dev/net | 281 | // read interfaces from /proc/dev/net |
282 | // SIOCGIFCONF does not return ALL interfaces ???!? | 282 | // SIOCGIFCONF does not return ALL interfaces ???!? |
283 | ProcDevNet = new QFile(PROCNETDEV); | 283 | ProcDevNet = new QFile(PROCNETDEV); |
284 | if( ! ProcDevNet->open(IO_ReadOnly) ) { | 284 | if( ! ProcDevNet->open(IO_ReadOnly) ) { |
285 | owarn << "Cannot open " | 285 | odebug << "Cannot open " |
286 | << PROCNETDEV | 286 | << PROCNETDEV |
287 | << " " | 287 | << " " |
288 | << errno | 288 | << errno |
289 | << " " | 289 | << " " |
290 | << strerror( errno ) | 290 | << strerror( errno ) |
291 | << oendl; | 291 | << oendl; |
292 | delete ProcDevNet; | 292 | delete ProcDevNet; |
293 | ProcDevNet =0; | 293 | ProcDevNet =0; |
294 | ::close( sockfd ); | 294 | ::close( sockfd ); |
295 | return; | 295 | return; |
296 | } | 296 | } |
297 | 297 | ||
298 | QString line; | 298 | QString line; |
299 | QString NicName; | 299 | QString NicName; |
300 | QTextStream procTs(ProcDevNet); | 300 | QTextStream procTs(ProcDevNet); |
301 | int loc = -1; | 301 | int loc = -1; |
302 | 302 | ||
303 | procTs.readLine(); // eat a line | 303 | procTs.readLine(); // eat a line |
304 | procTs.readLine(); // eat a line | 304 | procTs.readLine(); // eat a line |
305 | while((line = procTs.readLine().simplifyWhiteSpace()) != QString::null) { | 305 | while((line = procTs.readLine().simplifyWhiteSpace()) != QString::null) { |
306 | if((loc = line.find(":")) == -1) { | 306 | if((loc = line.find(":")) == -1) { |
307 | continue; | 307 | continue; |
308 | } | 308 | } |
309 | 309 | ||
310 | NicName = line.left(loc); | 310 | NicName = line.left(loc); |
311 | 311 | ||
312 | // set name for ioctl | 312 | // set name for ioctl |
313 | strcpy( ifrs.ifr_name, NicName.latin1() ); | 313 | strcpy( ifrs.ifr_name, NicName.latin1() ); |
314 | 314 | ||
315 | if ( ! ( IFI = ProbedInterfaces.find( NicName ) ) ) { | 315 | if ( ! ( IFI = ProbedInterfaces.find( NicName ) ) ) { |
316 | // new nic | 316 | // new nic |
317 | Log(("New NIC found : %s\n", NicName.latin1())); | 317 | Log(("New NIC found : %s\n", NicName.latin1())); |
318 | IFI = new InterfaceInfo; | 318 | IFI = new InterfaceInfo; |
319 | IFI->Name = line.left(loc); | 319 | IFI->Name = line.left(loc); |
320 | IFI->Collection = 0; | 320 | IFI->Collection = 0; |
321 | ProbedInterfaces.insert( IFI->Name, IFI ); | 321 | ProbedInterfaces.insert( IFI->Name, IFI ); |
322 | 322 | ||
323 | // get dynamic info | 323 | // get dynamic info |
324 | if( ioctl(sockfd, SIOCGIFFLAGS, &ifrs) >= 0 ) { | 324 | if( ioctl(sockfd, SIOCGIFFLAGS, &ifrs) >= 0 ) { |
325 | IFI->IsPointToPoint = ((ifrs.ifr_flags & IFF_POINTOPOINT) == IFF_POINTOPOINT); | 325 | IFI->IsPointToPoint = ((ifrs.ifr_flags & IFF_POINTOPOINT) == IFF_POINTOPOINT); |
326 | } else { | 326 | } else { |
327 | IFI->IsPointToPoint = 0; | 327 | IFI->IsPointToPoint = 0; |
328 | } | 328 | } |
329 | 329 | ||
330 | // settings that never change | 330 | // settings that never change |
331 | IFI->DstAddress = ""; | 331 | IFI->DstAddress = ""; |
332 | 332 | ||
333 | if( IFI->IsPointToPoint ) { | 333 | if( IFI->IsPointToPoint ) { |
334 | if( ioctl(sockfd, SIOCGIFDSTADDR, &ifrs) >= 0 ) { | 334 | if( ioctl(sockfd, SIOCGIFDSTADDR, &ifrs) >= 0 ) { |
335 | IFI->DstAddress = | 335 | IFI->DstAddress = |
336 | inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_dstaddr)->sin_addr); | 336 | inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_dstaddr)->sin_addr); |
337 | } | 337 | } |
338 | } | 338 | } |
339 | 339 | ||
340 | IFI->CardType = 999999; | 340 | IFI->CardType = 999999; |
341 | IFI->MACAddress = ""; | 341 | IFI->MACAddress = ""; |
342 | 342 | ||
343 | if( ioctl(sockfd, SIOCGIFHWADDR, &ifrs) >= 0 ) { | 343 | if( ioctl(sockfd, SIOCGIFHWADDR, &ifrs) >= 0 ) { |
344 | Log(("Family for NIC %s : %d\n", IFI->Name.latin1(), | 344 | Log(("Family for NIC %s : %d\n", IFI->Name.latin1(), |
345 | ifrs.ifr_hwaddr.sa_family )); | 345 | ifrs.ifr_hwaddr.sa_family )); |
346 | 346 | ||
347 | IFI->CardType = ifrs.ifr_hwaddr.sa_family; | 347 | IFI->CardType = ifrs.ifr_hwaddr.sa_family; |
348 | switch( ifrs.ifr_hwaddr.sa_family ) { | 348 | switch( ifrs.ifr_hwaddr.sa_family ) { |
349 | case ARPHRD_ETHER : // regular MAC address | 349 | case ARPHRD_ETHER : // regular MAC address |
350 | // valid address -> convert to regular ::: format | 350 | // valid address -> convert to regular ::: format |
351 | // length = 6 bytes = 12 DIGITS -> 6 : | 351 | // length = 6 bytes = 12 DIGITS -> 6 : |
352 | IFI->MACAddress.sprintf( | 352 | IFI->MACAddress.sprintf( |
353 | "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c", | 353 | "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c", |
354 | HN( ifrs.ifr_hwaddr.sa_data[0] ), | 354 | HN( ifrs.ifr_hwaddr.sa_data[0] ), |
355 | LN( ifrs.ifr_hwaddr.sa_data[0] ), | 355 | LN( ifrs.ifr_hwaddr.sa_data[0] ), |
356 | HN( ifrs.ifr_hwaddr.sa_data[1] ), | 356 | HN( ifrs.ifr_hwaddr.sa_data[1] ), |
357 | LN( ifrs.ifr_hwaddr.sa_data[1] ), | 357 | LN( ifrs.ifr_hwaddr.sa_data[1] ), |
358 | HN( ifrs.ifr_hwaddr.sa_data[2] ), | 358 | HN( ifrs.ifr_hwaddr.sa_data[2] ), |
359 | LN( ifrs.ifr_hwaddr.sa_data[2] ), | 359 | LN( ifrs.ifr_hwaddr.sa_data[2] ), |
360 | HN( ifrs.ifr_hwaddr.sa_data[3] ), | 360 | HN( ifrs.ifr_hwaddr.sa_data[3] ), |
361 | LN( ifrs.ifr_hwaddr.sa_data[3] ), | 361 | LN( ifrs.ifr_hwaddr.sa_data[3] ), |
362 | HN( ifrs.ifr_hwaddr.sa_data[4] ), | 362 | HN( ifrs.ifr_hwaddr.sa_data[4] ), |
363 | LN( ifrs.ifr_hwaddr.sa_data[4] ), | 363 | LN( ifrs.ifr_hwaddr.sa_data[4] ), |
364 | HN( ifrs.ifr_hwaddr.sa_data[5] ), | 364 | HN( ifrs.ifr_hwaddr.sa_data[5] ), |
365 | LN( ifrs.ifr_hwaddr.sa_data[5] ) | 365 | LN( ifrs.ifr_hwaddr.sa_data[5] ) |
366 | ); | 366 | ); |
367 | break; | 367 | break; |
368 | #ifdef ARPHRD_IEEE1394 | 368 | #ifdef ARPHRD_IEEE1394 |
369 | case ARPHRD_IEEE1394 : // Firewire Eth address | 369 | case ARPHRD_IEEE1394 : // Firewire Eth address |
370 | IFI->MACAddress.sprintf( | 370 | IFI->MACAddress.sprintf( |
371 | "%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-00-00", | 371 | "%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-00-00", |
372 | HN( ifrs.ifr_hwaddr.sa_data[0] ), | 372 | HN( ifrs.ifr_hwaddr.sa_data[0] ), |
373 | LN( ifrs.ifr_hwaddr.sa_data[0] ), | 373 | LN( ifrs.ifr_hwaddr.sa_data[0] ), |
374 | HN( ifrs.ifr_hwaddr.sa_data[1] ), | 374 | HN( ifrs.ifr_hwaddr.sa_data[1] ), |
375 | LN( ifrs.ifr_hwaddr.sa_data[1] ), | 375 | LN( ifrs.ifr_hwaddr.sa_data[1] ), |
376 | HN( ifrs.ifr_hwaddr.sa_data[2] ), | 376 | HN( ifrs.ifr_hwaddr.sa_data[2] ), |
377 | LN( ifrs.ifr_hwaddr.sa_data[2] ), | 377 | LN( ifrs.ifr_hwaddr.sa_data[2] ), |
378 | HN( ifrs.ifr_hwaddr.sa_data[3] ), | 378 | HN( ifrs.ifr_hwaddr.sa_data[3] ), |
379 | LN( ifrs.ifr_hwaddr.sa_data[3] ), | 379 | LN( ifrs.ifr_hwaddr.sa_data[3] ), |
380 | HN( ifrs.ifr_hwaddr.sa_data[4] ), | 380 | HN( ifrs.ifr_hwaddr.sa_data[4] ), |
381 | LN( ifrs.ifr_hwaddr.sa_data[4] ), | 381 | LN( ifrs.ifr_hwaddr.sa_data[4] ), |
382 | HN( ifrs.ifr_hwaddr.sa_data[5] ), | 382 | HN( ifrs.ifr_hwaddr.sa_data[5] ), |
383 | LN( ifrs.ifr_hwaddr.sa_data[5] ), | 383 | LN( ifrs.ifr_hwaddr.sa_data[5] ), |
384 | HN( ifrs.ifr_hwaddr.sa_data[6] ), | 384 | HN( ifrs.ifr_hwaddr.sa_data[6] ), |
385 | LN( ifrs.ifr_hwaddr.sa_data[6] ), | 385 | LN( ifrs.ifr_hwaddr.sa_data[6] ), |
386 | HN( ifrs.ifr_hwaddr.sa_data[7] ), | 386 | HN( ifrs.ifr_hwaddr.sa_data[7] ), |
387 | LN( ifrs.ifr_hwaddr.sa_data[7] ), | 387 | LN( ifrs.ifr_hwaddr.sa_data[7] ), |
388 | HN( ifrs.ifr_hwaddr.sa_data[8] ), | 388 | HN( ifrs.ifr_hwaddr.sa_data[8] ), |
389 | LN( ifrs.ifr_hwaddr.sa_data[8] ), | 389 | LN( ifrs.ifr_hwaddr.sa_data[8] ), |
390 | HN( ifrs.ifr_hwaddr.sa_data[9] ), | 390 | HN( ifrs.ifr_hwaddr.sa_data[9] ), |
391 | LN( ifrs.ifr_hwaddr.sa_data[9] ), | 391 | LN( ifrs.ifr_hwaddr.sa_data[9] ), |
392 | HN( ifrs.ifr_hwaddr.sa_data[10] ), | 392 | HN( ifrs.ifr_hwaddr.sa_data[10] ), |
393 | LN( ifrs.ifr_hwaddr.sa_data[10] ), | 393 | LN( ifrs.ifr_hwaddr.sa_data[10] ), |
394 | HN( ifrs.ifr_hwaddr.sa_data[11] ), | 394 | HN( ifrs.ifr_hwaddr.sa_data[11] ), |
395 | LN( ifrs.ifr_hwaddr.sa_data[11] ), | 395 | LN( ifrs.ifr_hwaddr.sa_data[11] ), |
396 | HN( ifrs.ifr_hwaddr.sa_data[12] ), | 396 | HN( ifrs.ifr_hwaddr.sa_data[12] ), |
397 | LN( ifrs.ifr_hwaddr.sa_data[12] ), | 397 | LN( ifrs.ifr_hwaddr.sa_data[12] ), |
398 | HN( ifrs.ifr_hwaddr.sa_data[13] ), | 398 | HN( ifrs.ifr_hwaddr.sa_data[13] ), |
399 | LN( ifrs.ifr_hwaddr.sa_data[13] ) | 399 | LN( ifrs.ifr_hwaddr.sa_data[13] ) |
400 | ); | 400 | ); |
401 | break; | 401 | break; |
402 | #endif | 402 | #endif |
403 | case ARPHRD_PPP : // PPP | 403 | case ARPHRD_PPP : // PPP |
404 | break; | 404 | break; |
405 | case ARPHRD_IEEE80211 : // WLAN | 405 | case ARPHRD_IEEE80211 : // WLAN |
406 | break; | 406 | break; |
407 | case ARPHRD_IRDA : // IRDA | 407 | case ARPHRD_IRDA : // IRDA |
408 | break; | 408 | break; |
409 | } | 409 | } |
410 | } | 410 | } |
411 | } else // else already probed before -> just update | 411 | } else // else already probed before -> just update |
412 | Log(("Redetected NIC %s\n", NicName.latin1())); | 412 | Log(("Redetected NIC %s\n", NicName.latin1())); |
413 | 413 | ||
414 | // get dynamic info | 414 | // get dynamic info |
415 | if( ioctl(sockfd, SIOCGIFFLAGS, &ifrs) >= 0 ) { | 415 | if( ioctl(sockfd, SIOCGIFFLAGS, &ifrs) >= 0 ) { |
416 | IFI->IsUp = ((ifrs.ifr_flags & IFF_UP) == IFF_UP); | 416 | IFI->IsUp = ((ifrs.ifr_flags & IFF_UP) == IFF_UP); |
417 | IFI->HasMulticast = ((ifrs.ifr_flags & IFF_MULTICAST) == IFF_MULTICAST); | 417 | IFI->HasMulticast = ((ifrs.ifr_flags & IFF_MULTICAST) == IFF_MULTICAST); |
418 | } else { | 418 | } else { |
419 | IFI->IsUp = 0; | 419 | IFI->IsUp = 0; |
420 | IFI->HasMulticast = 0; | 420 | IFI->HasMulticast = 0; |
421 | } | 421 | } |
422 | 422 | ||
423 | if( ioctl(sockfd, SIOCGIFADDR, &ifrs) >= 0 ) { | 423 | if( ioctl(sockfd, SIOCGIFADDR, &ifrs) >= 0 ) { |
424 | IFI->Address = | 424 | IFI->Address = |
425 | inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_addr)->sin_addr); | 425 | inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_addr)->sin_addr); |
426 | } else { | 426 | } else { |
427 | IFI->Address = ""; | 427 | IFI->Address = ""; |
428 | IFI->IsUp = 0; | 428 | IFI->IsUp = 0; |
429 | } | 429 | } |
430 | if( ioctl(sockfd, SIOCGIFBRDADDR, &ifrs) >= 0 ) { | 430 | if( ioctl(sockfd, SIOCGIFBRDADDR, &ifrs) >= 0 ) { |
431 | IFI->BCastAddress = | 431 | IFI->BCastAddress = |
432 | inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_broadaddr)->sin_addr); | 432 | inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_broadaddr)->sin_addr); |
433 | } else { | 433 | } else { |
434 | IFI->BCastAddress = ""; | 434 | IFI->BCastAddress = ""; |
435 | } | 435 | } |
436 | if( ioctl(sockfd, SIOCGIFNETMASK, &ifrs) >= 0 ) { | 436 | if( ioctl(sockfd, SIOCGIFNETMASK, &ifrs) >= 0 ) { |
437 | IFI->Netmask = | 437 | IFI->Netmask = |
438 | inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_netmask)->sin_addr); | 438 | inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_netmask)->sin_addr); |
439 | } else { | 439 | } else { |
440 | IFI->Netmask = ""; | 440 | IFI->Netmask = ""; |
441 | } | 441 | } |
442 | Log(("NIC %s UP ? %d\n", NicName.latin1(), IFI->IsUp )); | 442 | Log(("NIC %s UP ? %d\n", NicName.latin1(), IFI->IsUp )); |
443 | } | 443 | } |
444 | 444 | ||
445 | ::close( sockfd ); | 445 | ::close( sockfd ); |
446 | } | 446 | } |
447 | 447 | ||
448 | InterfaceInfo * System::findInterface( const QString & N ) { | 448 | InterfaceInfo * System::findInterface( const QString & N ) { |
449 | InterfaceInfo * Run; | 449 | InterfaceInfo * Run; |
450 | // has PAN connection UP interface ? | 450 | // has PAN connection UP interface ? |
451 | for( QDictIterator<InterfaceInfo> It(ProbedInterfaces); | 451 | for( QDictIterator<InterfaceInfo> It(ProbedInterfaces); |
452 | It.current(); | 452 | It.current(); |
453 | ++It ) { | 453 | ++It ) { |
454 | Run = It.current(); | 454 | Run = It.current(); |
455 | if( N == Run->Name ) { | 455 | if( N == Run->Name ) { |
456 | // this PAN connection is up | 456 | // this PAN connection is up |
457 | return Run; | 457 | return Run; |
458 | } | 458 | } |
459 | } | 459 | } |
460 | return 0; | 460 | return 0; |
461 | } | 461 | } |
462 | 462 | ||
463 | #include <stdarg.h> | 463 | #include <stdarg.h> |
464 | static FILE * logf = 0; | 464 | static FILE * logf = 0; |
465 | 465 | ||
466 | void VLog( char * Format, ... ) { | 466 | void VLog( char * Format, ... ) { |
467 | va_list l; | 467 | va_list l; |
468 | 468 | ||
469 | va_start(l, Format ); | 469 | va_start(l, Format ); |
470 | 470 | ||
471 | if( logf == (FILE *)0 ) { | 471 | if( logf == (FILE *)0 ) { |
472 | QString S = getenv("NS2LOG"); | 472 | QString S = getenv("NS2LOG"); |
473 | if( S == "stderr" ) { | 473 | if( S == "stderr" ) { |
474 | logf = stderr; | 474 | logf = stderr; |
475 | } else if( S.isEmpty() ) { | 475 | } else if( S.isEmpty() ) { |
476 | logf = fopen( "/tmp/ns2log", "a" ); | 476 | logf = fopen( "/tmp/ns2log", "a" ); |
477 | } else { | 477 | } else { |
478 | logf = fopen( S, "a" ); | 478 | logf = fopen( S, "a" ); |
479 | } | 479 | } |
480 | 480 | ||
481 | if( ! logf ) { | 481 | if( ! logf ) { |
482 | fprintf( stderr, "Cannot open logfile %s : %d\n", | 482 | fprintf( stderr, "Cannot open logfile %s : %d\n", |
483 | S.latin1(), errno ); | 483 | S.latin1(), errno ); |
484 | logf = (FILE *)1; | 484 | logf = (FILE *)1; |
485 | } else { | 485 | } else { |
486 | fprintf( logf, "____ OPEN LOGFILE ____\n"); | 486 | fprintf( logf, "____ OPEN LOGFILE ____\n"); |
487 | } | 487 | } |
488 | } | 488 | } |
489 | 489 | ||
490 | if( (unsigned long)logf > 1 ) { | 490 | if( (unsigned long)logf > 1 ) { |
491 | vfprintf( logf, Format, l ); | 491 | vfprintf( logf, Format, l ); |
492 | } | 492 | } |
493 | va_end( l ); | 493 | va_end( l ); |
494 | fflush( logf ); | 494 | fflush( logf ); |
495 | 495 | ||
496 | } | 496 | } |
497 | 497 | ||
498 | void LogClose( void ) { | 498 | void LogClose( void ) { |
499 | if( (long)logf > 1 ) { | 499 | if( (long)logf > 1 ) { |
500 | fprintf( logf, "____ CLOSE LOGFILE ____\n"); | 500 | fprintf( logf, "____ CLOSE LOGFILE ____\n"); |
501 | if( logf != stderr ) { | 501 | if( logf != stderr ) { |
502 | fclose( logf ); | 502 | fclose( logf ); |
503 | } | 503 | } |
504 | logf = 0; | 504 | logf = 0; |
505 | } | 505 | } |
506 | } | 506 | } |
507 | 507 | ||
508 | QString removeSpaces( const QString & X ) { | 508 | QString removeSpaces( const QString & X ) { |
509 | QString Y; | 509 | QString Y; |
510 | Y = X.simplifyWhiteSpace(); | 510 | Y = X.simplifyWhiteSpace(); |
511 | Y.replace( QRegExp(" "), "_" ); | 511 | Y.replace( QRegExp(" "), "_" ); |
512 | owarn << X << " **" << Y << "**" << oendl; | 512 | odebug << X << " **" << Y << "**" << oendl; |
513 | return Y; | 513 | return Y; |
514 | } | 514 | } |
515 | 515 | ||
516 | // | 516 | // |
517 | // | 517 | // |
518 | // | 518 | // |
519 | // | 519 | // |
520 | // | 520 | // |
521 | 521 | ||
522 | MyProcess::MyProcess() : QObject(), StdoutBuffer(), StderrBuffer() { | 522 | MyProcess::MyProcess() : QObject(), StdoutBuffer(), StderrBuffer() { |
523 | P = new OProcess(); | 523 | P = new OProcess(); |
524 | connect( P, | 524 | connect( P, |
525 | SIGNAL( receivedStdout(Opie::Core::OProcess*, char*, int ) ), | 525 | SIGNAL( receivedStdout(Opie::Core::OProcess*, char*, int ) ), |
526 | this, | 526 | this, |
527 | SLOT( SLOT_Stdout(Opie::Core::OProcess*,char*,int) ) ); | 527 | SLOT( SLOT_Stdout(Opie::Core::OProcess*,char*,int) ) ); |
528 | 528 | ||
529 | connect( P, | 529 | connect( P, |
530 | SIGNAL( receivedStderr(Opie::Core::OProcess*, char*, int ) ), | 530 | SIGNAL( receivedStderr(Opie::Core::OProcess*, char*, int ) ), |
531 | this, | 531 | this, |
532 | SLOT( SLOT_Stderr(Opie::Core::OProcess*,char*,int) ) ); | 532 | SLOT( SLOT_Stderr(Opie::Core::OProcess*,char*,int) ) ); |
533 | connect( P, | 533 | connect( P, |
534 | SIGNAL( processExited(Opie::Core::OProcess*) ), | 534 | SIGNAL( processExited(Opie::Core::OProcess*) ), |
535 | this, | 535 | this, |
536 | SLOT( SLOT_ProcessExited(Opie::Core::OProcess*) ) ); | 536 | SLOT( SLOT_ProcessExited(Opie::Core::OProcess*) ) ); |
537 | } | 537 | } |
538 | 538 | ||
539 | MyProcess::~MyProcess() { | 539 | MyProcess::~MyProcess() { |
540 | delete P; | 540 | delete P; |
541 | } | 541 | } |
542 | 542 | ||
543 | void MyProcess::SLOT_Stdout( Opie::Core::OProcess * , char * Buf, int len ) { | 543 | void MyProcess::SLOT_Stdout( Opie::Core::OProcess * , char * Buf, int len ) { |
544 | char * LB = (char *)alloca( len + 1 ); | 544 | char * LB = (char *)alloca( len + 1 ); |
545 | memcpy( LB, Buf, len ); | 545 | memcpy( LB, Buf, len ); |
546 | LB[len] = '\0'; | 546 | LB[len] = '\0'; |
547 | 547 | ||
548 | // now input is zero terminated | 548 | // now input is zero terminated |
549 | StdoutBuffer += LB; | 549 | StdoutBuffer += LB; |
550 | 550 | ||
551 | owarn << "Received " << len << " bytes on stdout" << oendl; | 551 | odebug << "Received " << len << " bytes on stdout" << oendl; |
552 | // see if we have some lines (allow empty lines) | 552 | // see if we have some lines (allow empty lines) |
553 | QStringList SL = QStringList::split( "\n", StdoutBuffer, TRUE ); | 553 | QStringList SL = QStringList::split( "\n", StdoutBuffer, TRUE ); |
554 | 554 | ||
555 | for( unsigned int i = 0; i < SL.count()-1; i ++ ) { | 555 | for( unsigned int i = 0; i < SL.count()-1; i ++ ) { |
556 | Log(( "Stdout : \"%s\"\n", SL[i].latin1() ) ); | 556 | Log(( "Stdout : \"%s\"\n", SL[i].latin1() ) ); |
557 | emit stdoutLine( SL[i] ); | 557 | emit stdoutLine( SL[i] ); |
558 | } | 558 | } |
559 | 559 | ||
560 | // last line is rest | 560 | // last line is rest |
561 | StdoutBuffer = SL[ SL.count()-1 ]; | 561 | StdoutBuffer = SL[ SL.count()-1 ]; |
562 | } | 562 | } |
563 | 563 | ||
564 | void MyProcess::SLOT_Stderr( Opie::Core::OProcess * , char * Buf, int len ) { | 564 | void MyProcess::SLOT_Stderr( Opie::Core::OProcess * , char * Buf, int len ) { |
565 | char * LB = (char *)alloca( len + 1 ); | 565 | char * LB = (char *)alloca( len + 1 ); |
566 | memcpy( LB, Buf, len ); | 566 | memcpy( LB, Buf, len ); |
567 | LB[len] = '\0'; | 567 | LB[len] = '\0'; |
568 | 568 | ||
569 | // now input is zero terminated | 569 | // now input is zero terminated |
570 | StderrBuffer += LB; | 570 | StderrBuffer += LB; |
571 | 571 | ||
572 | owarn << "Received " << len << " bytes on stderr" << oendl; | 572 | odebug << "Received " << len << " bytes on stderr" << oendl; |
573 | // see if we have some lines (allow empty lines) | 573 | // see if we have some lines (allow empty lines) |
574 | QStringList SL = QStringList::split( "\n", StderrBuffer, TRUE ); | 574 | QStringList SL = QStringList::split( "\n", StderrBuffer, TRUE ); |
575 | 575 | ||
576 | for( unsigned int i = 0; i < SL.count()-1; i ++ ) { | 576 | for( unsigned int i = 0; i < SL.count()-1; i ++ ) { |
577 | Log(( "Stderr : \"%s\"\n", SL[i].latin1() ) ); | 577 | Log(( "Stderr : \"%s\"\n", SL[i].latin1() ) ); |
578 | emit stderrLine( SL[i] ); | 578 | emit stderrLine( SL[i] ); |
579 | } | 579 | } |
580 | 580 | ||
581 | // last line is rest | 581 | // last line is rest |
582 | StderrBuffer = SL[ SL.count()-1 ]; | 582 | StderrBuffer = SL[ SL.count()-1 ]; |
583 | } | 583 | } |
584 | 584 | ||
585 | void MyProcess::SLOT_ProcessExited( Opie::Core::OProcess * ) { | 585 | void MyProcess::SLOT_ProcessExited( Opie::Core::OProcess * ) { |
586 | emit processExited( this ); | 586 | emit processExited( this ); |
587 | } | 587 | } |
diff --git a/noncore/settings/networksettings2/networksettings2/systemfile.cpp b/noncore/settings/networksettings2/networksettings2/systemfile.cpp index 8deef94..1b1988e 100644 --- a/noncore/settings/networksettings2/networksettings2/systemfile.cpp +++ b/noncore/settings/networksettings2/networksettings2/systemfile.cpp | |||
@@ -1,235 +1,235 @@ | |||
1 | #include <stdio.h> | 1 | #include <stdio.h> |
2 | #include <qpe/qpeapplication.h> | 2 | #include <qpe/qpeapplication.h> |
3 | #include <qfileinfo.h> | 3 | #include <qfileinfo.h> |
4 | #include <qmessagebox.h> | 4 | #include <qmessagebox.h> |
5 | #include <qfile.h> | 5 | #include <qfile.h> |
6 | #include <qtextstream.h> | 6 | #include <qtextstream.h> |
7 | 7 | ||
8 | #include "resources.h" | 8 | #include "resources.h" |
9 | #include "systemfile.h" | 9 | #include "systemfile.h" |
10 | 10 | ||
11 | #define TEMPLATEDIR "NS2templates/" | 11 | #define TEMPLATEDIR "NS2templates/" |
12 | QString TemplDir; | 12 | QString TemplDir; |
13 | 13 | ||
14 | SystemFile::SystemFile( const QString & N, | 14 | SystemFile::SystemFile( const QString & N, |
15 | const QString & P, | 15 | const QString & P, |
16 | bool KDI ){ | 16 | bool KDI ){ |
17 | Name = N; | 17 | Name = N; |
18 | Path = P; | 18 | Path = P; |
19 | InAppend = 0; | 19 | InAppend = 0; |
20 | F = 0; | 20 | F = 0; |
21 | // get template info | 21 | // get template info |
22 | { QString S; | 22 | { QString S; |
23 | QFileInfo FI; | 23 | QFileInfo FI; |
24 | 24 | ||
25 | // find location of templates | 25 | // find location of templates |
26 | TemplDir = QPEApplication::qpeDir() + "etc/" + TEMPLATEDIR; | 26 | TemplDir = QPEApplication::qpeDir() + "etc/" + TEMPLATEDIR; |
27 | FI.setFile( TemplDir ); | 27 | FI.setFile( TemplDir ); |
28 | if( ! FI.isDir() ) { | 28 | if( ! FI.isDir() ) { |
29 | // try current dir | 29 | // try current dir |
30 | TemplDir = "./" TEMPLATEDIR; | 30 | TemplDir = "./" TEMPLATEDIR; |
31 | FI.setFile( TemplDir ); | 31 | FI.setFile( TemplDir ); |
32 | if( ! FI.isDir() ) { | 32 | if( ! FI.isDir() ) { |
33 | hasPreSection = | 33 | hasPreSection = |
34 | hasPostSection = | 34 | hasPostSection = |
35 | hasPreNodeSection = | 35 | hasPreNodeSection = |
36 | hasPostNodeSection = | 36 | hasPostNodeSection = |
37 | hasPreDeviceSection = | 37 | hasPreDeviceSection = |
38 | hasPostDeviceSection = 0; | 38 | hasPostDeviceSection = 0; |
39 | return; | 39 | return; |
40 | } | 40 | } |
41 | } | 41 | } |
42 | 42 | ||
43 | // have found location | 43 | // have found location |
44 | S = TemplDir + Name + "/presection"; | 44 | S = TemplDir + Name + "/presection"; |
45 | FI.setFile( S ); | 45 | FI.setFile( S ); |
46 | hasPreSection = ( FI.exists() && FI.isReadable() ); | 46 | hasPreSection = ( FI.exists() && FI.isReadable() ); |
47 | S = TemplDir + Name + "/postsection"; | 47 | S = TemplDir + Name + "/postsection"; |
48 | FI.setFile( S ); | 48 | FI.setFile( S ); |
49 | hasPostSection = ( FI.exists() && FI.isReadable() ); | 49 | hasPostSection = ( FI.exists() && FI.isReadable() ); |
50 | S = TemplDir + Name + "/prenodesection"; | 50 | S = TemplDir + Name + "/prenodesection"; |
51 | FI.setFile( S ); | 51 | FI.setFile( S ); |
52 | hasPreNodeSection = ( FI.exists() && FI.isReadable() ); | 52 | hasPreNodeSection = ( FI.exists() && FI.isReadable() ); |
53 | S = TemplDir + Name + "/postnodesection"; | 53 | S = TemplDir + Name + "/postnodesection"; |
54 | FI.setFile( S ); | 54 | FI.setFile( S ); |
55 | hasPostNodeSection = ( FI.exists() && FI.isReadable() ); | 55 | hasPostNodeSection = ( FI.exists() && FI.isReadable() ); |
56 | S = TemplDir + Name + "/predevicesection"; | 56 | S = TemplDir + Name + "/predevicesection"; |
57 | FI.setFile( S ); | 57 | FI.setFile( S ); |
58 | hasPreDeviceSection = ( FI.exists() && FI.isReadable() ); | 58 | hasPreDeviceSection = ( FI.exists() && FI.isReadable() ); |
59 | S = TemplDir + Name + "/postdevicesection"; | 59 | S = TemplDir + Name + "/postdevicesection"; |
60 | FI.setFile( S ); | 60 | FI.setFile( S ); |
61 | hasPostDeviceSection = ( FI.exists() && FI.isReadable() ); | 61 | hasPostDeviceSection = ( FI.exists() && FI.isReadable() ); |
62 | } | 62 | } |
63 | 63 | ||
64 | KnowsDeviceInstances = KDI; | 64 | KnowsDeviceInstances = KDI; |
65 | } | 65 | } |
66 | 66 | ||
67 | SystemFile::SystemFile( const QString & N, bool KDI ){ | 67 | SystemFile::SystemFile( const QString & N, bool KDI ){ |
68 | Name = N; | 68 | Name = N; |
69 | Path = ""; | 69 | Path = ""; |
70 | InAppend = 0; | 70 | InAppend = 0; |
71 | F =0; | 71 | F =0; |
72 | KnowsDeviceInstances = KDI; | 72 | KnowsDeviceInstances = KDI; |
73 | hasPreSection = | 73 | hasPreSection = |
74 | hasPostSection = | 74 | hasPostSection = |
75 | hasPreNodeSection = | 75 | hasPreNodeSection = |
76 | hasPostNodeSection = | 76 | hasPostNodeSection = |
77 | hasPreDeviceSection = | 77 | hasPreDeviceSection = |
78 | hasPostDeviceSection = 0; | 78 | hasPostDeviceSection = 0; |
79 | } | 79 | } |
80 | 80 | ||
81 | SystemFile::~SystemFile( void ) { | 81 | SystemFile::~SystemFile( void ) { |
82 | close(); | 82 | close(); |
83 | } | 83 | } |
84 | 84 | ||
85 | bool SystemFile::open( void ) { | 85 | bool SystemFile::open( void ) { |
86 | QString Prefix = getenv( "NS2OUTPUTTO" ); | 86 | QString Prefix = getenv( "NS2OUTPUTTO" ); |
87 | 87 | ||
88 | if( Prefix != "stderr" /* && Name != "interfaces" */ ) { | 88 | if( Prefix != "stderr" /* && Name != "interfaces" */ ) { |
89 | // generate files where the need to be | 89 | // generate files where the need to be |
90 | if( F ) { | 90 | if( F ) { |
91 | F->close(); | 91 | F->close(); |
92 | delete F; | 92 | delete F; |
93 | } | 93 | } |
94 | 94 | ||
95 | F = new QFile( Prefix + Path + ((InAppend)?"":"bup") ); | 95 | F = new QFile( Prefix + Path + ((InAppend)?"":"bup") ); |
96 | Log(( "Open systemfile %s\n", F->name().latin1() )); | 96 | Log(( "Open systemfile %s\n", F->name().latin1() )); |
97 | if( ! F->open( ((InAppend)?IO_Append : 0 ) | IO_WriteOnly ) ) { | 97 | if( ! F->open( ((InAppend)?IO_Append : 0 ) | IO_WriteOnly ) ) { |
98 | return 0; | 98 | return 0; |
99 | } | 99 | } |
100 | } else { | 100 | } else { |
101 | if( ! F ) { | 101 | if( ! F ) { |
102 | owarn << "!!!!!!!!!!!!!!!!!! " << oendl; | 102 | odebug << "!!!!!!!!!!!!!!!!!! " << oendl; |
103 | owarn << "!!!! TESTMODE !!!!" << oendl; | 103 | odebug << "!!!! TESTMODE !!!!" << oendl; |
104 | owarn << "!!!!!!!!!!!!!!!!!! " << oendl; | 104 | odebug << "!!!!!!!!!!!!!!!!!! " << oendl; |
105 | owarn << "!!!!" << oendl; | 105 | odebug << "!!!!" << oendl; |
106 | owarn << "!!!! GENERATE " << Path << oendl; | 106 | odebug << "!!!! GENERATE " << Path << oendl; |
107 | if( InAppend ) { | 107 | if( InAppend ) { |
108 | owarn << "!!!! In APPEND mode" << oendl; | 108 | odebug << "!!!! In APPEND mode" << oendl; |
109 | } | 109 | } |
110 | owarn << "!!!!" << oendl; | 110 | odebug << "!!!!" << oendl; |
111 | owarn << "!!!!!!!!!!!!!!!!!!" << oendl; | 111 | odebug << "!!!!!!!!!!!!!!!!!!" << oendl; |
112 | 112 | ||
113 | F = new QFile(); | 113 | F = new QFile(); |
114 | F->open( IO_WriteOnly, stderr ); | 114 | F->open( IO_WriteOnly, stderr ); |
115 | } | 115 | } |
116 | } | 116 | } |
117 | setDevice( F ); | 117 | setDevice( F ); |
118 | return 1; | 118 | return 1; |
119 | } | 119 | } |
120 | 120 | ||
121 | bool SystemFile::close( void ) { | 121 | bool SystemFile::close( void ) { |
122 | if( ! F || ! F->isOpen() ) { | 122 | if( ! F || ! F->isOpen() ) { |
123 | return 1 ; | 123 | return 1 ; |
124 | } | 124 | } |
125 | 125 | ||
126 | QString Prefix = getenv( "NS2OUTPUTTO" ); | 126 | QString Prefix = getenv( "NS2OUTPUTTO" ); |
127 | 127 | ||
128 | if( Prefix == "stderr" ) { | 128 | if( Prefix == "stderr" ) { |
129 | return 1; | 129 | return 1; |
130 | } | 130 | } |
131 | 131 | ||
132 | QString OldP = Prefix + Path + "bup"; | 132 | QString OldP = Prefix + Path + "bup"; |
133 | 133 | ||
134 | F->close(); | 134 | F->close(); |
135 | delete F; | 135 | delete F; |
136 | F = 0; | 136 | F = 0; |
137 | 137 | ||
138 | if( ! InAppend ) { | 138 | if( ! InAppend ) { |
139 | owarn << "Rename " << OldP << " to " << Path << oendl; | 139 | odebug << "Rename " << OldP << " to " << Path << oendl; |
140 | return ( rename( OldP.latin1(), Path.latin1() ) >= 0 ); | 140 | return ( rename( OldP.latin1(), Path.latin1() ) >= 0 ); |
141 | } | 141 | } |
142 | return 1; | 142 | return 1; |
143 | } | 143 | } |
144 | 144 | ||
145 | bool SystemFile::preSection( void ) { | 145 | bool SystemFile::preSection( void ) { |
146 | if( hasPreSection ) { | 146 | if( hasPreSection ) { |
147 | QFile Fl( TemplDir + Name + "/presection" ); | 147 | QFile Fl( TemplDir + Name + "/presection" ); |
148 | if( ! Fl.open( IO_ReadOnly ) ) | 148 | if( ! Fl.open( IO_ReadOnly ) ) |
149 | return 0; // error | 149 | return 0; // error |
150 | // copy file to this file | 150 | // copy file to this file |
151 | F->writeBlock( Fl.readAll() ); | 151 | F->writeBlock( Fl.readAll() ); |
152 | } | 152 | } |
153 | return 1; | 153 | return 1; |
154 | } | 154 | } |
155 | 155 | ||
156 | bool SystemFile::postSection( void ) { | 156 | bool SystemFile::postSection( void ) { |
157 | if( hasPostSection ) { | 157 | if( hasPostSection ) { |
158 | QFile Fl( TemplDir + Name + "/postsection" ); | 158 | QFile Fl( TemplDir + Name + "/postsection" ); |
159 | if( ! Fl.open( IO_ReadOnly ) ) | 159 | if( ! Fl.open( IO_ReadOnly ) ) |
160 | return 0; // error | 160 | return 0; // error |
161 | // copy file to this file | 161 | // copy file to this file |
162 | F->writeBlock( Fl.readAll() ); | 162 | F->writeBlock( Fl.readAll() ); |
163 | } | 163 | } |
164 | return 1; | 164 | return 1; |
165 | } | 165 | } |
166 | 166 | ||
167 | bool SystemFile::preNodeSection( ANetNodeInstance * NNI, long ) { | 167 | bool SystemFile::preNodeSection( ANetNodeInstance * NNI, long ) { |
168 | if( hasPreNodeSection ) { | 168 | if( hasPreNodeSection ) { |
169 | QFile Fl( TemplDir + Name + "/prenodesection" ); | 169 | QFile Fl( TemplDir + Name + "/prenodesection" ); |
170 | if( ! Fl.open( IO_ReadOnly ) ) | 170 | if( ! Fl.open( IO_ReadOnly ) ) |
171 | return 0; // error | 171 | return 0; // error |
172 | QTextStream TX( &Fl ); | 172 | QTextStream TX( &Fl ); |
173 | QString Out; | 173 | QString Out; |
174 | QString S = TX.readLine(); | 174 | QString S = TX.readLine(); |
175 | while( ! TX.eof() ) { | 175 | while( ! TX.eof() ) { |
176 | Out = S. | 176 | Out = S. |
177 | arg(NNI->nodeClass()->name()); | 177 | arg(NNI->nodeClass()->name()); |
178 | (*this) << Out << endl; | 178 | (*this) << Out << endl; |
179 | S = TX.readLine(); | 179 | S = TX.readLine(); |
180 | } | 180 | } |
181 | } | 181 | } |
182 | return 1; | 182 | return 1; |
183 | } | 183 | } |
184 | 184 | ||
185 | bool SystemFile::postNodeSection( ANetNodeInstance * NNI, long ) { | 185 | bool SystemFile::postNodeSection( ANetNodeInstance * NNI, long ) { |
186 | if( hasPostNodeSection ) { | 186 | if( hasPostNodeSection ) { |
187 | QFile Fl( TemplDir + Name + "/postnodesection" ); | 187 | QFile Fl( TemplDir + Name + "/postnodesection" ); |
188 | if( ! Fl.open( IO_ReadOnly ) ) | 188 | if( ! Fl.open( IO_ReadOnly ) ) |
189 | return 0; // error | 189 | return 0; // error |
190 | QTextStream TX( &Fl ); | 190 | QTextStream TX( &Fl ); |
191 | QString Out; | 191 | QString Out; |
192 | QString S = TX.readLine(); | 192 | QString S = TX.readLine(); |
193 | while( ! TX.eof() ) { | 193 | while( ! TX.eof() ) { |
194 | Out = S. | 194 | Out = S. |
195 | arg(NNI->name()); | 195 | arg(NNI->name()); |
196 | (*this) << Out << endl; | 196 | (*this) << Out << endl; |
197 | S = TX.readLine(); | 197 | S = TX.readLine(); |
198 | } | 198 | } |
199 | } | 199 | } |
200 | return 1; | 200 | return 1; |
201 | } | 201 | } |
202 | 202 | ||
203 | bool SystemFile::preDeviceSection( ANetNode * NN ) { | 203 | bool SystemFile::preDeviceSection( ANetNode * NN ) { |
204 | if( hasPreDeviceSection ) { | 204 | if( hasPreDeviceSection ) { |
205 | QFile Fl( TemplDir + Name + "/predevicesection" ); | 205 | QFile Fl( TemplDir + Name + "/predevicesection" ); |
206 | if( ! Fl.open( IO_ReadOnly ) ) | 206 | if( ! Fl.open( IO_ReadOnly ) ) |
207 | return 0; // error | 207 | return 0; // error |
208 | QTextStream TX( &Fl ); | 208 | QTextStream TX( &Fl ); |
209 | QString Out; | 209 | QString Out; |
210 | QString S = TX.readLine(); | 210 | QString S = TX.readLine(); |
211 | while( ! TX.eof() ) { | 211 | while( ! TX.eof() ) { |
212 | Out = S.arg(NN->name()); | 212 | Out = S.arg(NN->name()); |
213 | (*this) << Out << endl; | 213 | (*this) << Out << endl; |
214 | S = TX.readLine(); | 214 | S = TX.readLine(); |
215 | } | 215 | } |
216 | } | 216 | } |
217 | return 1; | 217 | return 1; |
218 | } | 218 | } |
219 | 219 | ||
220 | bool SystemFile::postDeviceSection( ANetNode * NN ) { | 220 | bool SystemFile::postDeviceSection( ANetNode * NN ) { |
221 | if( hasPostDeviceSection ) { | 221 | if( hasPostDeviceSection ) { |
222 | QFile Fl( TemplDir + Name + "/postdevicesection" ); | 222 | QFile Fl( TemplDir + Name + "/postdevicesection" ); |
223 | if( ! Fl.open( IO_ReadOnly ) ) | 223 | if( ! Fl.open( IO_ReadOnly ) ) |
224 | return 0; // error | 224 | return 0; // error |
225 | QTextStream TX( &Fl ); | 225 | QTextStream TX( &Fl ); |
226 | QString Out; | 226 | QString Out; |
227 | QString S = TX.readLine(); | 227 | QString S = TX.readLine(); |
228 | while( ! TX.eof() ) { | 228 | while( ! TX.eof() ) { |
229 | Out = S.arg(NN->name()); | 229 | Out = S.arg(NN->name()); |
230 | (*this) << Out << endl; | 230 | (*this) << Out << endl; |
231 | S = TX.readLine(); | 231 | S = TX.readLine(); |
232 | } | 232 | } |
233 | } | 233 | } |
234 | return 1; | 234 | return 1; |
235 | } | 235 | } |
diff --git a/noncore/settings/networksettings2/opie-networksettings2.postinst b/noncore/settings/networksettings2/opie-networksettings2.postinst index ce43274..d1d98ac 100755 --- a/noncore/settings/networksettings2/opie-networksettings2.postinst +++ b/noncore/settings/networksettings2/opie-networksettings2.postinst | |||
@@ -1,9 +1,9 @@ | |||
1 | #!/bin/sh | 1 | #!/bin/sh |
2 | 2 | ||
3 | QTPB=/opt/QtPalmtop/bin | 3 | QTPB=/opt/QtPalmtop/bin |
4 | 4 | ||
5 | [ ! -L ${QTPB}/networksettings2-request ] && ln -sf ${QTPB}/networksettings2 ${QTPB}/networksettings2-request | 5 | [ ! -L ${QTPB}/networksettings2-request ] && ln -sf ${QTPB}/networksettings2 ${QTPB}/networksettings2-request |
6 | 6 | ||
7 | qcop QPE/TaskBar "reloadApps()" | 7 | ${QTPB}/qcop QPE/TaskBar "reloadApps()" |
8 | 8 | ||
9 | exit 0 | 9 | exit 0 |
diff --git a/noncore/settings/networksettings2/opietooth2/OTDevice.cpp b/noncore/settings/networksettings2/opietooth2/OTDevice.cpp index 62f17a0..c6f7d5e 100644 --- a/noncore/settings/networksettings2/opietooth2/OTDevice.cpp +++ b/noncore/settings/networksettings2/opietooth2/OTDevice.cpp | |||
@@ -1,256 +1,256 @@ | |||
1 | #include <qdir.h> | 1 | #include <qdir.h> |
2 | #include <qfileinfo.h> | 2 | #include <qfileinfo.h> |
3 | 3 | ||
4 | #include <bluezlib.h> | 4 | #include <bluezlib.h> |
5 | 5 | ||
6 | /* OPIE */ | 6 | /* OPIE */ |
7 | #include <opie2/odevice.h> | 7 | #include <opie2/odevice.h> |
8 | #include <opie2/oprocess.h> | 8 | #include <opie2/oprocess.h> |
9 | #include <opie2/odebug.h> | 9 | #include <opie2/odebug.h> |
10 | 10 | ||
11 | #include <OTDevice.h> | 11 | #include <OTDevice.h> |
12 | 12 | ||
13 | using namespace Opie::Core; | 13 | using namespace Opie::Core; |
14 | using namespace Opietooth2; | 14 | using namespace Opietooth2; |
15 | using Opie::Core::OProcess; | 15 | using Opie::Core::OProcess; |
16 | 16 | ||
17 | OTDevice::OTDevice( OTGateway * _OT ) : QObject(0, "device") { | 17 | OTDevice::OTDevice( OTGateway * _OT ) : QObject(0, "device") { |
18 | 18 | ||
19 | // initialize | 19 | // initialize |
20 | OT = _OT; | 20 | OT = _OT; |
21 | 21 | ||
22 | // detect bluetooth type | 22 | // detect bluetooth type |
23 | QString a, b; // fake | 23 | QString a, b; // fake |
24 | unsigned long c; // fake | 24 | unsigned long c; // fake |
25 | detectDeviceType( a, b, c ); | 25 | detectDeviceType( a, b, c ); |
26 | 26 | ||
27 | if( needsAttach() ) { | 27 | if( needsAttach() ) { |
28 | // requires HCIATTACH | 28 | // requires HCIATTACH |
29 | // pid of hciattach | 29 | // pid of hciattach |
30 | m_hciattachPid = getPidOfHCIAttach(); | 30 | m_hciattachPid = getPidOfHCIAttach(); |
31 | 31 | ||
32 | m_hciattach = 0; | 32 | m_hciattach = 0; |
33 | 33 | ||
34 | if( m_hciattachPid == 0 ) { | 34 | if( m_hciattachPid == 0 ) { |
35 | // no pid -> not attached | 35 | // no pid -> not attached |
36 | m_deviceNr = -1; | 36 | m_deviceNr = -1; |
37 | } else { | 37 | } else { |
38 | // system enabled | 38 | // system enabled |
39 | // currently no way to figure out which attach produce which | 39 | // currently no way to figure out which attach produce which |
40 | // hci | 40 | // hci |
41 | m_deviceNr = 0; | 41 | m_deviceNr = 0; |
42 | } | 42 | } |
43 | } else { | 43 | } else { |
44 | m_deviceNr = 0; | 44 | m_deviceNr = 0; |
45 | } | 45 | } |
46 | } | 46 | } |
47 | 47 | ||
48 | OTDevice::~OTDevice(){ | 48 | OTDevice::~OTDevice(){ |
49 | if( needsAttach() && m_hciattach ) { | 49 | if( needsAttach() && m_hciattach ) { |
50 | // does not auto stop bluetooth | 50 | // does not auto stop bluetooth |
51 | m_hciattach->detach(); | 51 | m_hciattach->detach(); |
52 | delete m_hciattach; | 52 | delete m_hciattach; |
53 | } | 53 | } |
54 | } | 54 | } |
55 | 55 | ||
56 | bool OTDevice::attach(){ | 56 | bool OTDevice::attach(){ |
57 | 57 | ||
58 | if( needsAttach() && m_hciattachPid == 0 ) { | 58 | if( needsAttach() && m_hciattachPid == 0 ) { |
59 | QString Dev, Mode; | 59 | QString Dev, Mode; |
60 | unsigned long Spd; | 60 | unsigned long Spd; |
61 | 61 | ||
62 | detectDeviceType( Dev, Mode, Spd ); | 62 | detectDeviceType( Dev, Mode, Spd ); |
63 | 63 | ||
64 | // not yet started | 64 | // not yet started |
65 | m_hciattach = new OProcess(); | 65 | m_hciattach = new OProcess(); |
66 | *m_hciattach << "hciattach"; | 66 | *m_hciattach << "hciattach"; |
67 | *m_hciattach << "-p"; // so that it prints its pid | 67 | *m_hciattach << "-p"; // so that it prints its pid |
68 | *m_hciattach << Dev | 68 | *m_hciattach << Dev |
69 | << Mode | 69 | << Mode |
70 | << QString().setNum(Spd); | 70 | << QString().setNum(Spd); |
71 | 71 | ||
72 | connect( m_hciattach, | 72 | connect( m_hciattach, |
73 | SIGNAL(receivedStdout(Opie::Core::OProcess*, char*, int ) ), | 73 | SIGNAL(receivedStdout(Opie::Core::OProcess*, char*, int ) ), |
74 | this, SLOT | 74 | this, SLOT |
75 | (slotStdOut(Opie::Core::OProcess*,char*,int) ) ); | 75 | (slotStdOut(Opie::Core::OProcess*,char*,int) ) ); |
76 | 76 | ||
77 | connect( m_hciattach, | 77 | connect( m_hciattach, |
78 | SIGNAL(receivedStderr(Opie::Core::OProcess*, char*, int ) ), | 78 | SIGNAL(receivedStderr(Opie::Core::OProcess*, char*, int ) ), |
79 | this, SLOT | 79 | this, SLOT |
80 | (slotStdErr(Opie::Core::OProcess*,char*,int) ) ); | 80 | (slotStdErr(Opie::Core::OProcess*,char*,int) ) ); |
81 | 81 | ||
82 | // we need to start this in 'dontcare' mode because | 82 | // we need to start this in 'dontcare' mode because |
83 | // if qpe exists we want the hci to keep running | 83 | // if qpe exists we want the hci to keep running |
84 | if( ! m_hciattach->start( OProcess::DontCare, | 84 | if( ! m_hciattach->start( OProcess::DontCare, |
85 | OProcess::AllOutput | 85 | OProcess::AllOutput |
86 | ) ){ | 86 | ) ){ |
87 | emit error( tr( "Could not start hciattach" ) ); | 87 | emit error( tr( "Could not start hciattach" ) ); |
88 | delete m_hciattach; | 88 | delete m_hciattach; |
89 | m_hciattach = 0; | 89 | m_hciattach = 0; |
90 | return FALSE; | 90 | return FALSE; |
91 | } | 91 | } |
92 | } | 92 | } |
93 | 93 | ||
94 | return TRUE; | 94 | return TRUE; |
95 | } | 95 | } |
96 | 96 | ||
97 | bool OTDevice::detach(){ | 97 | bool OTDevice::detach(){ |
98 | 98 | ||
99 | if( needsAttach() && m_hciattachPid ) { | 99 | if( needsAttach() && m_hciattachPid ) { |
100 | if( m_hciattach ) { | 100 | if( m_hciattach ) { |
101 | delete m_hciattach; | 101 | delete m_hciattach; |
102 | m_hciattach = 0; | 102 | m_hciattach = 0; |
103 | } | 103 | } |
104 | 104 | ||
105 | if( kill( m_hciattachPid, 9) < 0 ) { | 105 | if( kill( m_hciattachPid, 9) < 0 ) { |
106 | owarn << "could not stop " << errno << oendl; | 106 | odebug << "could not stop " << errno << oendl; |
107 | emit error( tr( "Could not stop process" ) ); | 107 | emit error( tr( "Could not stop process" ) ); |
108 | return FALSE; | 108 | return FALSE; |
109 | } | 109 | } |
110 | m_hciattachPid = 0; | 110 | m_hciattachPid = 0; |
111 | emit isEnabled( m_deviceNr, 0 ); | 111 | emit isEnabled( m_deviceNr, 0 ); |
112 | m_deviceNr = -1; | 112 | m_deviceNr = -1; |
113 | } | 113 | } |
114 | 114 | ||
115 | return TRUE; | 115 | return TRUE; |
116 | } | 116 | } |
117 | 117 | ||
118 | bool OTDevice::isAttached()const{ | 118 | bool OTDevice::isAttached()const{ |
119 | return ! needsAttach() || m_hciattachPid != 0; | 119 | return ! needsAttach() || m_hciattachPid != 0; |
120 | } | 120 | } |
121 | 121 | ||
122 | bool OTDevice::checkAttach(){ | 122 | bool OTDevice::checkAttach(){ |
123 | if( ! needsAttach() ) { | 123 | if( ! needsAttach() ) { |
124 | m_deviceNr = 0; | 124 | m_deviceNr = 0; |
125 | emit isEnabled( 0, 1 ); | 125 | emit isEnabled( 0, 1 ); |
126 | return TRUE; | 126 | return TRUE; |
127 | } | 127 | } |
128 | 128 | ||
129 | if( m_hciattachPid ) { | 129 | if( m_hciattachPid ) { |
130 | QString S; | 130 | QString S; |
131 | S.setNum( m_hciattachPid ); | 131 | S.setNum( m_hciattachPid ); |
132 | QDir D( "/proc" ); | 132 | QDir D( "/proc" ); |
133 | if( !D.exists( S ) ) { | 133 | if( !D.exists( S ) ) { |
134 | // down | 134 | // down |
135 | m_hciattachPid = 0; | 135 | m_hciattachPid = 0; |
136 | emit isEnabled( m_deviceNr, 0 ); | 136 | emit isEnabled( m_deviceNr, 0 ); |
137 | m_deviceNr = -1; | 137 | m_deviceNr = -1; |
138 | } | 138 | } |
139 | } else { | 139 | } else { |
140 | // check | 140 | // check |
141 | m_hciattachPid = getPidOfHCIAttach(); | 141 | m_hciattachPid = getPidOfHCIAttach(); |
142 | if ( m_hciattachPid ) { | 142 | if ( m_hciattachPid ) { |
143 | m_deviceNr = 0; | 143 | m_deviceNr = 0; |
144 | emit isEnabled( m_deviceNr, 1 ); | 144 | emit isEnabled( m_deviceNr, 1 ); |
145 | } | 145 | } |
146 | } | 146 | } |
147 | return m_hciattachPid != 0; | 147 | return m_hciattachPid != 0; |
148 | } | 148 | } |
149 | 149 | ||
150 | void OTDevice::slotStdOut(OProcess* proc, char* , int ) { | 150 | void OTDevice::slotStdOut(OProcess* proc, char* , int ) { |
151 | if( proc == m_hciattach ) { | 151 | if( proc == m_hciattach ) { |
152 | m_hciattach->detach(); | 152 | m_hciattach->detach(); |
153 | 153 | ||
154 | // system enabled | 154 | // system enabled |
155 | // currently no way to figure out which attach produce which | 155 | // currently no way to figure out which attach produce which |
156 | // hci | 156 | // hci |
157 | if( m_deviceNr == -1 ) { | 157 | if( m_deviceNr == -1 ) { |
158 | m_deviceNr = 0; | 158 | m_deviceNr = 0; |
159 | emit isEnabled( m_deviceNr, 1 ); | 159 | emit isEnabled( m_deviceNr, 1 ); |
160 | } | 160 | } |
161 | } | 161 | } |
162 | } | 162 | } |
163 | 163 | ||
164 | void OTDevice::slotStdErr(OProcess* proc, char* chars, int len) { | 164 | void OTDevice::slotStdErr(OProcess* proc, char* chars, int len) { |
165 | 165 | ||
166 | if(proc == m_hciattach && len >= 1 ){ | 166 | if(proc == m_hciattach && len >= 1 ){ |
167 | // collect output | 167 | // collect output |
168 | QCString string( chars, len+1 ); // \0 == +1 | 168 | QCString string( chars, len+1 ); // \0 == +1 |
169 | QString m_output; | 169 | QString m_output; |
170 | m_output.append( string.data() ); | 170 | m_output.append( string.data() ); |
171 | owarn << m_output << oendl; | 171 | odebug << m_output << oendl; |
172 | } | 172 | } |
173 | } | 173 | } |
174 | 174 | ||
175 | pid_t OTDevice::getPidOfHCIAttach( void ) { | 175 | pid_t OTDevice::getPidOfHCIAttach( void ) { |
176 | 176 | ||
177 | if( needsAttach() ) { | 177 | if( needsAttach() ) { |
178 | // not yet attached -> perhaps now ? | 178 | // not yet attached -> perhaps now ? |
179 | // load /proc dir and check if command name contains hciattach | 179 | // load /proc dir and check if command name contains hciattach |
180 | QRegExp R("[0-9]+"); | 180 | QRegExp R("[0-9]+"); |
181 | QDir ProcDir( "/proc" ); | 181 | QDir ProcDir( "/proc" ); |
182 | QFileInfo FI; | 182 | QFileInfo FI; |
183 | QStringList EL = ProcDir.entryList( QDir::Dirs ); | 183 | QStringList EL = ProcDir.entryList( QDir::Dirs ); |
184 | 184 | ||
185 | // print it out | 185 | // print it out |
186 | for ( QStringList::Iterator it = EL.begin(); | 186 | for ( QStringList::Iterator it = EL.begin(); |
187 | it != EL.end(); | 187 | it != EL.end(); |
188 | ++it ) { | 188 | ++it ) { |
189 | if( R.match( (*it) ) >= 0 ) { | 189 | if( R.match( (*it) ) >= 0 ) { |
190 | // is pid | 190 | // is pid |
191 | 191 | ||
192 | // get command being executed | 192 | // get command being executed |
193 | FI.setFile( ProcDir.path()+"/"+ (*it) + "/exe" ); | 193 | FI.setFile( ProcDir.path()+"/"+ (*it) + "/exe" ); |
194 | 194 | ||
195 | // get the link | 195 | // get the link |
196 | if( FI.readLink().right( 9 ) == "hciattach" ) { | 196 | if( FI.readLink().right( 9 ) == "hciattach" ) { |
197 | // this is hci attach process | 197 | // this is hci attach process |
198 | 198 | ||
199 | return (*it).toULong(); | 199 | return (*it).toULong(); |
200 | break; | 200 | break; |
201 | } | 201 | } |
202 | } | 202 | } |
203 | } | 203 | } |
204 | } | 204 | } |
205 | 205 | ||
206 | return 0; | 206 | return 0; |
207 | } | 207 | } |
208 | 208 | ||
209 | void OTDevice::detectDeviceType( QString & Device, | 209 | void OTDevice::detectDeviceType( QString & Device, |
210 | QString & Mode, | 210 | QString & Mode, |
211 | unsigned long & Speed ) { | 211 | unsigned long & Speed ) { |
212 | 212 | ||
213 | // detect device type and determine parms | 213 | // detect device type and determine parms |
214 | owarn << "Detecting device" << oendl; | 214 | odebug << "Detecting device" << oendl; |
215 | switch ( ODevice::inst()->model() ) { | 215 | switch ( ODevice::inst()->model() ) { |
216 | case Model_iPAQ_H39xx: | 216 | case Model_iPAQ_H39xx: |
217 | Device = "/dev/tts/1"; | 217 | Device = "/dev/tts/1"; |
218 | Mode = "bcsp"; | 218 | Mode = "bcsp"; |
219 | Speed = 921600; | 219 | Speed = 921600; |
220 | NeedsAttach = 1; | 220 | NeedsAttach = 1; |
221 | break; | 221 | break; |
222 | 222 | ||
223 | case Model_iPAQ_H5xxx: | 223 | case Model_iPAQ_H5xxx: |
224 | Device = "/dev/tts/1"; | 224 | Device = "/dev/tts/1"; |
225 | Mode = "any"; | 225 | Mode = "any"; |
226 | Speed = 921600; | 226 | Speed = 921600; |
227 | NeedsAttach = 1; | 227 | NeedsAttach = 1; |
228 | break; | 228 | break; |
229 | 229 | ||
230 | case Model_GenuineIntel : | 230 | case Model_GenuineIntel : |
231 | Device = ""; | 231 | Device = ""; |
232 | Mode = ""; | 232 | Mode = ""; |
233 | Speed = 0; | 233 | Speed = 0; |
234 | NeedsAttach = 0; | 234 | NeedsAttach = 0; |
235 | break; | 235 | break; |
236 | 236 | ||
237 | default: | 237 | default: |
238 | Device = "/dev/ttySB0"; | 238 | Device = "/dev/ttySB0"; |
239 | Mode = "bcsp"; | 239 | Mode = "bcsp"; |
240 | Speed = 230400; | 240 | Speed = 230400; |
241 | NeedsAttach = 1; | 241 | NeedsAttach = 1; |
242 | break; | 242 | break; |
243 | } | 243 | } |
244 | } | 244 | } |
245 | 245 | ||
246 | QString OTDevice::getRFCommDevicePattern( void ) { | 246 | QString OTDevice::getRFCommDevicePattern( void ) { |
247 | 247 | ||
248 | QDir D( "/dev/bluetooth/rfcomm" ); | 248 | QDir D( "/dev/bluetooth/rfcomm" ); |
249 | if( D.exists() ) { | 249 | if( D.exists() ) { |
250 | // devfs | 250 | // devfs |
251 | return QString( "/dev/bluetooth/rfcomm/%1" ); | 251 | return QString( "/dev/bluetooth/rfcomm/%1" ); |
252 | } | 252 | } |
253 | 253 | ||
254 | // regular 'dev' directory | 254 | // regular 'dev' directory |
255 | return QString( "/dev/rfcomm%1" ); | 255 | return QString( "/dev/rfcomm%1" ); |
256 | } | 256 | } |
diff --git a/noncore/settings/networksettings2/opietooth2/OTDriver.cpp b/noncore/settings/networksettings2/opietooth2/OTDriver.cpp index 8bd7919..a7ee662 100644 --- a/noncore/settings/networksettings2/opietooth2/OTDriver.cpp +++ b/noncore/settings/networksettings2/opietooth2/OTDriver.cpp | |||
@@ -1,744 +1,744 @@ | |||
1 | /*************************************************************************** | 1 | /*************************************************************************** |
2 | * Copyright (C) 2003 by Mattia Merzi * | 2 | * Copyright (C) 2003 by Mattia Merzi * |
3 | * ottobit@ferrara.linux.it * | 3 | * ottobit@ferrara.linux.it * |
4 | * * | 4 | * * |
5 | * This program is free software; you can redistribute it and/or modify * | 5 | * This program is free software; you can redistribute it and/or modify * |
6 | * it under the terms of the GNU General Public License as published by * | 6 | * it under the terms of the GNU General Public License as published by * |
7 | * the Free Software Foundation; either version 2 of the License, or * | 7 | * the Free Software Foundation; either version 2 of the License, or * |
8 | * (at your option) any later version. * | 8 | * (at your option) any later version. * |
9 | ***************************************************************************/ | 9 | ***************************************************************************/ |
10 | 10 | ||
11 | #include <opie2/odebug.h> | 11 | #include <opie2/odebug.h> |
12 | #include <qtimer.h> | 12 | #include <qtimer.h> |
13 | 13 | ||
14 | #include <sys/poll.h> | 14 | #include <sys/poll.h> |
15 | #include <bluezlib.h> | 15 | #include <bluezlib.h> |
16 | 16 | ||
17 | #include <OTGateway.h> | 17 | #include <OTGateway.h> |
18 | #include <OTDriver.h> | 18 | #include <OTDriver.h> |
19 | #include <OTHCISocket.h> | 19 | #include <OTHCISocket.h> |
20 | 20 | ||
21 | using namespace Opietooth2; | 21 | using namespace Opietooth2; |
22 | 22 | ||
23 | static struct { | 23 | static struct { |
24 | const char *str; | 24 | const char *str; |
25 | unsigned short rev; | 25 | unsigned short rev; |
26 | } csr_map[] = { | 26 | } csr_map[] = { |
27 | { "HCI 11.2 (bc01b)", 114 }, | 27 | { "HCI 11.2 (bc01b)", 114 }, |
28 | { "HCI 11.3 (bc01b)", 115 }, | 28 | { "HCI 11.3 (bc01b)", 115 }, |
29 | { "HCI 12.1 (bc01b)", 119 }, | 29 | { "HCI 12.1 (bc01b)", 119 }, |
30 | { "HCI 12.3 (bc01b)", 134 }, | 30 | { "HCI 12.3 (bc01b)", 134 }, |
31 | { "HCI 12.7 (bc01b)", 188 }, | 31 | { "HCI 12.7 (bc01b)", 188 }, |
32 | { "HCI 12.8 (bc01b)", 218 }, | 32 | { "HCI 12.8 (bc01b)", 218 }, |
33 | { "HCI 12.9 (bc01b)", 283 }, | 33 | { "HCI 12.9 (bc01b)", 283 }, |
34 | { "HCI 13.10 (bc01b)", 309 }, | 34 | { "HCI 13.10 (bc01b)", 309 }, |
35 | { "HCI 13.11 (bc01b)", 351 }, | 35 | { "HCI 13.11 (bc01b)", 351 }, |
36 | { "HCI 16.4 (bc01b)", 523 }, | 36 | { "HCI 16.4 (bc01b)", 523 }, |
37 | { "HCI 14.3 (bc02x)", 272 }, | 37 | { "HCI 14.3 (bc02x)", 272 }, |
38 | { "HCI 14.6 (bc02x)", 336 }, | 38 | { "HCI 14.6 (bc02x)", 336 }, |
39 | { "HCI 14.7 (bc02x)", 373 }, | 39 | { "HCI 14.7 (bc02x)", 373 }, |
40 | { "HCI 14.8 (bc02x)", 487 }, | 40 | { "HCI 14.8 (bc02x)", 487 }, |
41 | { "HCI 15.3 (bc02x)", 443 }, | 41 | { "HCI 15.3 (bc02x)", 443 }, |
42 | { "HCI 16.4 (bc02x)", 525 }, | 42 | { "HCI 16.4 (bc02x)", 525 }, |
43 | { NULL, 0} | 43 | { NULL, 0} |
44 | }; | 44 | }; |
45 | 45 | ||
46 | static char *services[] = { "Positioning", | 46 | static char *services[] = { "Positioning", |
47 | "Networking", | 47 | "Networking", |
48 | "Rendering", | 48 | "Rendering", |
49 | "Capturing", | 49 | "Capturing", |
50 | "Object Transfer", | 50 | "Object Transfer", |
51 | "Audio", | 51 | "Audio", |
52 | "Telephony", | 52 | "Telephony", |
53 | "Information" }; | 53 | "Information" }; |
54 | 54 | ||
55 | static char *major_devices[] = { "Miscellaneous", | 55 | static char *major_devices[] = { "Miscellaneous", |
56 | "Computer", | 56 | "Computer", |
57 | "Phone", | 57 | "Phone", |
58 | "LAN Access", | 58 | "LAN Access", |
59 | "Audio/Video", | 59 | "Audio/Video", |
60 | "Peripheral", | 60 | "Peripheral", |
61 | "Imaging", | 61 | "Imaging", |
62 | "Uncategorized" }; | 62 | "Uncategorized" }; |
63 | 63 | ||
64 | 64 | ||
65 | typedef struct { | 65 | typedef struct { |
66 | short Minor; | 66 | short Minor; |
67 | const char * Description; | 67 | const char * Description; |
68 | } ClassMap_t; | 68 | } ClassMap_t; |
69 | 69 | ||
70 | static ClassMap_t MapMiscClass[] = { | 70 | static ClassMap_t MapMiscClass[] = { |
71 | { -1, "" } | 71 | { -1, "" } |
72 | }; | 72 | }; |
73 | 73 | ||
74 | static ClassMap_t MapUnclassifiedClass[] = { | 74 | static ClassMap_t MapUnclassifiedClass[] = { |
75 | { -1, "" } | 75 | { -1, "" } |
76 | }; | 76 | }; |
77 | 77 | ||
78 | static ClassMap_t MapComputerClass[] = { | 78 | static ClassMap_t MapComputerClass[] = { |
79 | { 0, "Uncategorized" } , | 79 | { 0, "Uncategorized" } , |
80 | { 1, "Desktop workstation" } , | 80 | { 1, "Desktop workstation" } , |
81 | { 2, "Server" } , | 81 | { 2, "Server" } , |
82 | { 3, "Laptop" } , | 82 | { 3, "Laptop" } , |
83 | { 4, "Handheld" } , | 83 | { 4, "Handheld" } , |
84 | { 5, "Palm" } , | 84 | { 5, "Palm" } , |
85 | { 6, "Wearable" }, | 85 | { 6, "Wearable" }, |
86 | { -1, 0 } | 86 | { -1, 0 } |
87 | }; | 87 | }; |
88 | 88 | ||
89 | static ClassMap_t MapPhoneClass[] = { | 89 | static ClassMap_t MapPhoneClass[] = { |
90 | { 0, "Uncategorized" }, | 90 | { 0, "Uncategorized" }, |
91 | { 1, "Cellular" }, | 91 | { 1, "Cellular" }, |
92 | { 2, "Cordless" }, | 92 | { 2, "Cordless" }, |
93 | { 3, "Smart phone" }, | 93 | { 3, "Smart phone" }, |
94 | { 4, "Wired modem or voice gateway" }, | 94 | { 4, "Wired modem or voice gateway" }, |
95 | { 5, "Common ISDN Access" }, | 95 | { 5, "Common ISDN Access" }, |
96 | { 6, "Sim Card Reader" }, | 96 | { 6, "Sim Card Reader" }, |
97 | { -1, 0 } | 97 | { -1, 0 } |
98 | }; | 98 | }; |
99 | 99 | ||
100 | static ClassMap_t MapAVClass[] = { | 100 | static ClassMap_t MapAVClass[] = { |
101 | { 0, "Uncategorized" }, | 101 | { 0, "Uncategorized" }, |
102 | { 1, "Device conforms to the Headset profile" }, | 102 | { 1, "Device conforms to the Headset profile" }, |
103 | { 2, "Hands-free" }, | 103 | { 2, "Hands-free" }, |
104 | { 3, 0 }, | 104 | { 3, 0 }, |
105 | { 4, "Microphone" }, | 105 | { 4, "Microphone" }, |
106 | { 5, "Loudspeaker" }, | 106 | { 5, "Loudspeaker" }, |
107 | { 6, "Headphones" }, | 107 | { 6, "Headphones" }, |
108 | { 7, "Portable Audio" }, | 108 | { 7, "Portable Audio" }, |
109 | { 8, "Car Audio" }, | 109 | { 8, "Car Audio" }, |
110 | { 9, "Set-top box" }, | 110 | { 9, "Set-top box" }, |
111 | { 10, "HiFi Audio Device" }, | 111 | { 10, "HiFi Audio Device" }, |
112 | { 11, "VCR" }, | 112 | { 11, "VCR" }, |
113 | { 12, "Video Camera" }, | 113 | { 12, "Video Camera" }, |
114 | { 13, "Camcorder" }, | 114 | { 13, "Camcorder" }, |
115 | { 14, "Video Monitor" }, | 115 | { 14, "Video Monitor" }, |
116 | { 15, "Video Display and Loudspeaker" }, | 116 | { 15, "Video Display and Loudspeaker" }, |
117 | { 16, "Video Conferencing" }, | 117 | { 16, "Video Conferencing" }, |
118 | { 17, 0 }, | 118 | { 17, 0 }, |
119 | { 18, "Gaming/Toy" }, | 119 | { 18, "Gaming/Toy" }, |
120 | { -1, 0 } | 120 | { -1, 0 } |
121 | }; | 121 | }; |
122 | 122 | ||
123 | static ClassMap_t MapPeripheralClass[] = { | 123 | static ClassMap_t MapPeripheralClass[] = { |
124 | { 16, "Keyboard" }, | 124 | { 16, "Keyboard" }, |
125 | { 32, "Pointing device" }, | 125 | { 32, "Pointing device" }, |
126 | { 48, "Combo keyboard/pointing device" }, | 126 | { 48, "Combo keyboard/pointing device" }, |
127 | { -1, 0 } | 127 | { -1, 0 } |
128 | }; | 128 | }; |
129 | 129 | ||
130 | typedef struct { | 130 | typedef struct { |
131 | int Major; | 131 | int Major; |
132 | ClassMap_t * Map; | 132 | ClassMap_t * Map; |
133 | } MainClassMap_t; | 133 | } MainClassMap_t; |
134 | 134 | ||
135 | static MainClassMap_t MainClasses[] = { | 135 | static MainClassMap_t MainClasses[] = { |
136 | { 0, MapMiscClass }, | 136 | { 0, MapMiscClass }, |
137 | { 1, MapComputerClass }, | 137 | { 1, MapComputerClass }, |
138 | { 2, MapPhoneClass }, | 138 | { 2, MapPhoneClass }, |
139 | { 3, 0 }, // special case | 139 | { 3, 0 }, // special case |
140 | { 4, MapAVClass }, | 140 | { 4, MapAVClass }, |
141 | { 5, MapPeripheralClass }, | 141 | { 5, MapPeripheralClass }, |
142 | { 6, 0 }, // special case | 142 | { 6, 0 }, // special case |
143 | { 63, MapUnclassifiedClass }, | 143 | { 63, MapUnclassifiedClass }, |
144 | { -1, 0 } | 144 | { -1, 0 } |
145 | }; | 145 | }; |
146 | 146 | ||
147 | OTDriver::OTDriver( OTGateway * _OT, struct hci_dev_info* di) : QObject( _OT ), Address() { | 147 | OTDriver::OTDriver( OTGateway * _OT, struct hci_dev_info* di) : QObject( _OT ), Address() { |
148 | OT = _OT; | 148 | OT = _OT; |
149 | IsUp = 0; | 149 | IsUp = 0; |
150 | Socket = 0; | 150 | Socket = 0; |
151 | 151 | ||
152 | init(di); | 152 | init(di); |
153 | owarn << "Driver " << devname() << oendl; | 153 | odebug << "Driver " << devname() << oendl; |
154 | 154 | ||
155 | AutoClose = new QTimer( this ); | 155 | AutoClose = new QTimer( this ); |
156 | connect( AutoClose, | 156 | connect( AutoClose, |
157 | SIGNAL( timeout() ), | 157 | SIGNAL( timeout() ), |
158 | this, | 158 | this, |
159 | SLOT( SLOT_CloseFd() ) | 159 | SLOT( SLOT_CloseFd() ) |
160 | ); | 160 | ); |
161 | } | 161 | } |
162 | 162 | ||
163 | OTDriver::~OTDriver() { | 163 | OTDriver::~OTDriver() { |
164 | closeSocket(); | 164 | closeSocket(); |
165 | SLOT_CloseFd(); | 165 | SLOT_CloseFd(); |
166 | } | 166 | } |
167 | 167 | ||
168 | void OTDriver::SLOT_CloseFd( void ){ | 168 | void OTDriver::SLOT_CloseFd( void ){ |
169 | if ( isOpen() ) { | 169 | if ( isOpen() ) { |
170 | AutoClose->stop(); | 170 | AutoClose->stop(); |
171 | ::close( fd() ); | 171 | ::close( fd() ); |
172 | setfd( -1 ); | 172 | setfd( -1 ); |
173 | } | 173 | } |
174 | } | 174 | } |
175 | 175 | ||
176 | void OTDriver::init(struct hci_dev_info* di) { | 176 | void OTDriver::init(struct hci_dev_info* di) { |
177 | 177 | ||
178 | Dev = di->name; | 178 | Dev = di->name; |
179 | 179 | ||
180 | setDevId(di->dev_id); | 180 | setDevId(di->dev_id); |
181 | setType(di->type); | 181 | setType(di->type); |
182 | setFlags(di->flags); | 182 | setFlags(di->flags); |
183 | Address.setBDAddr( di->bdaddr ); | 183 | Address.setBDAddr( di->bdaddr ); |
184 | setFeatures(di->features); | 184 | setFeatures(di->features); |
185 | setfd( -1 ); // not open | 185 | setfd( -1 ); // not open |
186 | 186 | ||
187 | Manufacturer = ""; | 187 | Manufacturer = ""; |
188 | } | 188 | } |
189 | 189 | ||
190 | // internal reinitialize | 190 | // internal reinitialize |
191 | void OTDriver::reinit() { | 191 | void OTDriver::reinit() { |
192 | bool Old; | 192 | bool Old; |
193 | Old = IsUp; | 193 | Old = IsUp; |
194 | 194 | ||
195 | if( currentState() < 0 ) | 195 | if( currentState() < 0 ) |
196 | return; | 196 | return; |
197 | 197 | ||
198 | if( Old != IsUp ) { | 198 | if( Old != IsUp ) { |
199 | // state changes | 199 | // state changes |
200 | emit stateChange( this, IsUp ); | 200 | emit stateChange( this, IsUp ); |
201 | } | 201 | } |
202 | } | 202 | } |
203 | 203 | ||
204 | // requested by application | 204 | // requested by application |
205 | int OTDriver::currentState() { | 205 | int OTDriver::currentState() { |
206 | struct hci_dev_info di; | 206 | struct hci_dev_info di; |
207 | 207 | ||
208 | // uint16_t tmp_dev_id = device_info.dev_id; | 208 | // uint16_t tmp_dev_id = device_info.dev_id; |
209 | // bzero(&device_info,sizeof(struct hci_dev_info)); | 209 | // bzero(&device_info,sizeof(struct hci_dev_info)); |
210 | // device_info.dev_id = tmp_dev_id; | 210 | // device_info.dev_id = tmp_dev_id; |
211 | 211 | ||
212 | memset( &di, 0, sizeof( di ) ); | 212 | memset( &di, 0, sizeof( di ) ); |
213 | di.dev_id = Dev_id; | 213 | di.dev_id = Dev_id; |
214 | if( ioctl( OT->getSocket(), HCIGETDEVINFO, (void*)&di) < 0 ) { | 214 | if( ioctl( OT->getSocket(), HCIGETDEVINFO, (void*)&di) < 0 ) { |
215 | SLOT_CloseFd(); | 215 | SLOT_CloseFd(); |
216 | return -1; | 216 | return -1; |
217 | } else { | 217 | } else { |
218 | // load new info | 218 | // load new info |
219 | init(&di); | 219 | init(&di); |
220 | } | 220 | } |
221 | 221 | ||
222 | return IsUp; | 222 | return IsUp; |
223 | } | 223 | } |
224 | 224 | ||
225 | bool OTDriver::open() { | 225 | bool OTDriver::open() { |
226 | 226 | ||
227 | // (re)start single shot close | 227 | // (re)start single shot close |
228 | AutoClose->start( 30000, TRUE ); | 228 | AutoClose->start( 30000, TRUE ); |
229 | 229 | ||
230 | if( isOpen() ) | 230 | if( isOpen() ) |
231 | // is open | 231 | // is open |
232 | return 1; | 232 | return 1; |
233 | 233 | ||
234 | setfd(hci_open_dev(devId())); | 234 | setfd(hci_open_dev(devId())); |
235 | 235 | ||
236 | if (fd() < 0) { | 236 | if (fd() < 0) { |
237 | emit error( tr( "Can't open device %1. %2 : %3" ). | 237 | emit error( tr( "Can't open device %1. %2 : %3" ). |
238 | arg( devname() ). | 238 | arg( devname() ). |
239 | arg( errno ). | 239 | arg( errno ). |
240 | arg( strerror(errno) ) | 240 | arg( strerror(errno) ) |
241 | ); | 241 | ); |
242 | return 0; | 242 | return 0; |
243 | } | 243 | } |
244 | 244 | ||
245 | return 1; | 245 | return 1; |
246 | } | 246 | } |
247 | 247 | ||
248 | QString OTDriver::name() { | 248 | QString OTDriver::name() { |
249 | char name[1000]; | 249 | char name[1000]; |
250 | 250 | ||
251 | if( ! open() ) { | 251 | if( ! open() ) { |
252 | return tr("Cannot open"); | 252 | return tr("Cannot open"); |
253 | } | 253 | } |
254 | 254 | ||
255 | if (hci_read_local_name( fd(), sizeof(name), name, 1000) < 0) { | 255 | if (hci_read_local_name( fd(), sizeof(name), name, 1000) < 0) { |
256 | if (errno != ETIMEDOUT) { | 256 | if (errno != ETIMEDOUT) { |
257 | emit error( tr("Can't read local name on %1. %2 : %3. Default to %4" ). | 257 | emit error( tr("Can't read local name on %1. %2 : %3. Default to %4" ). |
258 | arg( devname() ). | 258 | arg( devname() ). |
259 | arg( errno ). | 259 | arg( errno ). |
260 | arg( strerror(errno) ). | 260 | arg( strerror(errno) ). |
261 | arg( devname() ) | 261 | arg( devname() ) |
262 | ); | 262 | ); |
263 | } // ETIMEDOUT error is quite normal, device is down ... I think ! :) | 263 | } // ETIMEDOUT error is quite normal, device is down ... I think ! :) |
264 | strcpy(name,devname().latin1()); | 264 | strcpy(name,devname().latin1()); |
265 | } | 265 | } |
266 | return QString(name); | 266 | return QString(name); |
267 | } | 267 | } |
268 | 268 | ||
269 | void OTDriver::setFlags(unsigned long flags) { | 269 | void OTDriver::setFlags(unsigned long flags) { |
270 | 270 | ||
271 | // kdDebug() << "Setting OTDriver Values ..." << endl; | 271 | // kdDebug() << "Setting OTDriver Values ..." << endl; |
272 | IsUp = BTVALUE(hci_test_bit(HCI_UP, &flags)); | 272 | IsUp = BTVALUE(hci_test_bit(HCI_UP, &flags)); |
273 | 273 | ||
274 | if (isUp()) { | 274 | if (isUp()) { |
275 | setIScan(BTVALUE(hci_test_bit(HCI_ISCAN, &flags))); | 275 | setIScan(BTVALUE(hci_test_bit(HCI_ISCAN, &flags))); |
276 | setPScan(BTVALUE(hci_test_bit(HCI_PSCAN, &flags))); | 276 | setPScan(BTVALUE(hci_test_bit(HCI_PSCAN, &flags))); |
277 | setAuthentication(BTVALUE(hci_test_bit(HCI_AUTH, &flags))); | 277 | setAuthentication(BTVALUE(hci_test_bit(HCI_AUTH, &flags))); |
278 | setEncryption(BTVALUE(hci_test_bit(HCI_ENCRYPT, &flags))); | 278 | setEncryption(BTVALUE(hci_test_bit(HCI_ENCRYPT, &flags))); |
279 | } else { | 279 | } else { |
280 | setIScan(BT_UNKNOWN); | 280 | setIScan(BT_UNKNOWN); |
281 | setPScan(BT_UNKNOWN); | 281 | setPScan(BT_UNKNOWN); |
282 | setAuthentication(BT_UNKNOWN); | 282 | setAuthentication(BT_UNKNOWN); |
283 | setEncryption(BT_UNKNOWN); | 283 | setEncryption(BT_UNKNOWN); |
284 | } | 284 | } |
285 | } | 285 | } |
286 | 286 | ||
287 | QString OTDriver::revision() { | 287 | QString OTDriver::revision() { |
288 | 288 | ||
289 | struct hci_version ver; | 289 | struct hci_version ver; |
290 | 290 | ||
291 | if( ! open() ) { | 291 | if( ! open() ) { |
292 | return tr("Cannot open"); | 292 | return tr("Cannot open"); |
293 | } | 293 | } |
294 | 294 | ||
295 | if (hci_read_local_version(fd(), &ver, 1000) < 0) { | 295 | if (hci_read_local_version(fd(), &ver, 1000) < 0) { |
296 | emit error( tr( "Can't read revision info on %1. %2 : %3" ). | 296 | emit error( tr( "Can't read revision info on %1. %2 : %3" ). |
297 | arg( devname() ). | 297 | arg( devname() ). |
298 | arg( errno ). | 298 | arg( errno ). |
299 | arg( strerror(errno) ) ); | 299 | arg( strerror(errno) ) ); |
300 | return QString(); | 300 | return QString(); |
301 | } | 301 | } |
302 | 302 | ||
303 | setManufacturer(ver.manufacturer); | 303 | setManufacturer(ver.manufacturer); |
304 | 304 | ||
305 | switch (ver.manufacturer) { | 305 | switch (ver.manufacturer) { |
306 | case 0: | 306 | case 0: |
307 | return getRevEricsson(); | 307 | return getRevEricsson(); |
308 | break; | 308 | break; |
309 | case 10: | 309 | case 10: |
310 | return getRevCsr(ver.hci_rev); | 310 | return getRevCsr(ver.hci_rev); |
311 | break; | 311 | break; |
312 | default: | 312 | default: |
313 | return tr( "Unsupported manufacturer" ); | 313 | return tr( "Unsupported manufacturer" ); |
314 | break; | 314 | break; |
315 | } | 315 | } |
316 | } | 316 | } |
317 | 317 | ||
318 | QString OTDriver::getRevEricsson() { | 318 | QString OTDriver::getRevEricsson() { |
319 | 319 | ||
320 | char revision[102]; | 320 | char revision[102]; |
321 | struct hci_request rq; | 321 | struct hci_request rq; |
322 | 322 | ||
323 | if( ! open() ) { | 323 | if( ! open() ) { |
324 | return QString( "Cannot open" ); | 324 | return QString( "Cannot open" ); |
325 | } | 325 | } |
326 | 326 | ||
327 | memset(&rq, 0, sizeof(rq)); | 327 | memset(&rq, 0, sizeof(rq)); |
328 | rq.ogf = 0x3f; | 328 | rq.ogf = 0x3f; |
329 | rq.ocf = 0x000f; | 329 | rq.ocf = 0x000f; |
330 | rq.cparam = NULL; | 330 | rq.cparam = NULL; |
331 | rq.clen = 0; | 331 | rq.clen = 0; |
332 | rq.rparam = &revision; | 332 | rq.rparam = &revision; |
333 | rq.rlen = sizeof(revision); | 333 | rq.rlen = sizeof(revision); |
334 | 334 | ||
335 | if (hci_send_req(fd(), &rq, 1000) < 0) { | 335 | if (hci_send_req(fd(), &rq, 1000) < 0) { |
336 | emit error( tr( "Can't read revision info on %1. %2 : %3" ). | 336 | emit error( tr( "Can't read revision info on %1. %2 : %3" ). |
337 | arg( devname() ). | 337 | arg( devname() ). |
338 | arg( errno ). | 338 | arg( errno ). |
339 | arg( strerror(errno) ) ); | 339 | arg( strerror(errno) ) ); |
340 | return QString(); | 340 | return QString(); |
341 | } | 341 | } |
342 | 342 | ||
343 | return QString( revision+1 ); | 343 | return QString( revision+1 ); |
344 | } | 344 | } |
345 | 345 | ||
346 | QString OTDriver::getRevCsr( unsigned short rev) { | 346 | QString OTDriver::getRevCsr( unsigned short rev) { |
347 | 347 | ||
348 | int i; | 348 | int i; |
349 | 349 | ||
350 | for (i = 0; csr_map[i].str; i++) | 350 | for (i = 0; csr_map[i].str; i++) |
351 | if (csr_map[i].rev == rev) { | 351 | if (csr_map[i].rev == rev) { |
352 | return QString( csr_map[i].str ); | 352 | return QString( csr_map[i].str ); |
353 | } | 353 | } |
354 | 354 | ||
355 | return tr( "Unknown firmware" ); | 355 | return tr( "Unknown firmware" ); |
356 | } | 356 | } |
357 | 357 | ||
358 | int OTDriver::reset() { | 358 | int OTDriver::reset() { |
359 | 359 | ||
360 | if( ! open() ) { | 360 | if( ! open() ) { |
361 | return 0; | 361 | return 0; |
362 | } | 362 | } |
363 | 363 | ||
364 | if( ioctl(fd(), HCIDEVRESET, devId()) < 0 ) { | 364 | if( ioctl(fd(), HCIDEVRESET, devId()) < 0 ) { |
365 | if( errno != EALREADY ) { | 365 | if( errno != EALREADY ) { |
366 | emit error( tr( "Reset failed for %1. %2 : %3" ). | 366 | emit error( tr( "Reset failed for %1. %2 : %3" ). |
367 | arg( devname() ). | 367 | arg( devname() ). |
368 | arg( errno ). | 368 | arg( errno ). |
369 | arg( strerror(errno) ) ); | 369 | arg( strerror(errno) ) ); |
370 | if (errno == EACCES) { | 370 | if (errno == EACCES) { |
371 | return EACCES; | 371 | return EACCES; |
372 | } | 372 | } |
373 | } | 373 | } |
374 | } | 374 | } |
375 | return 0; | 375 | return 0; |
376 | } | 376 | } |
377 | 377 | ||
378 | void OTDriver::setUp( bool M ) { | 378 | void OTDriver::setUp( bool M ) { |
379 | if( M && ! isUp() ) { | 379 | if( M && ! isUp() ) { |
380 | bringUp(); | 380 | bringUp(); |
381 | } else if( ! M && isUp() ) { | 381 | } else if( ! M && isUp() ) { |
382 | bringDown(); | 382 | bringDown(); |
383 | } | 383 | } |
384 | } | 384 | } |
385 | 385 | ||
386 | void OTDriver::bringUp() { | 386 | void OTDriver::bringUp() { |
387 | 387 | ||
388 | owarn << "bringUp : " << Dev << oendl; | 388 | odebug << "bringUp : " << Dev << oendl; |
389 | 389 | ||
390 | if( ! open() ) { | 390 | if( ! open() ) { |
391 | return; | 391 | return; |
392 | } | 392 | } |
393 | 393 | ||
394 | if (! isUp()) { | 394 | if (! isUp()) { |
395 | if( ioctl(fd(), HCIDEVUP, devId()) < 0 ) { | 395 | if( ioctl(fd(), HCIDEVUP, devId()) < 0 ) { |
396 | if( errno != EALREADY ) { | 396 | if( errno != EALREADY ) { |
397 | emit error( tr( "Cannot bring interface %1 up. %2 : %3" ). | 397 | emit error( tr( "Cannot bring interface %1 up. %2 : %3" ). |
398 | arg( devname() ). | 398 | arg( devname() ). |
399 | arg( errno ). | 399 | arg( errno ). |
400 | arg( strerror(errno) ) ); | 400 | arg( strerror(errno) ) ); |
401 | } | 401 | } |
402 | return; | 402 | return; |
403 | } | 403 | } |
404 | // have to wait a bit for the 'up' to become active | 404 | // have to wait a bit for the 'up' to become active |
405 | QTimer::singleShot( 3000, this, SLOT( reinit() ) ); | 405 | QTimer::singleShot( 3000, this, SLOT( reinit() ) ); |
406 | } | 406 | } |
407 | } | 407 | } |
408 | 408 | ||
409 | void OTDriver::bringDown() { | 409 | void OTDriver::bringDown() { |
410 | 410 | ||
411 | owarn << "bringDown : " << Dev << oendl; | 411 | odebug << "bringDown : " << Dev << oendl; |
412 | 412 | ||
413 | if( ! open() ) { | 413 | if( ! open() ) { |
414 | return; | 414 | return; |
415 | } | 415 | } |
416 | 416 | ||
417 | if ( isUp() ) { | 417 | if ( isUp() ) { |
418 | if( ioctl(fd(), HCIDEVDOWN, devId()) < 0 ) { | 418 | if( ioctl(fd(), HCIDEVDOWN, devId()) < 0 ) { |
419 | if( errno != EALREADY ) { | 419 | if( errno != EALREADY ) { |
420 | emit error( tr( "Cannot bring interface %1 down. %2 : %3" ). | 420 | emit error( tr( "Cannot bring interface %1 down. %2 : %3" ). |
421 | arg( devname() ). | 421 | arg( devname() ). |
422 | arg( errno ). | 422 | arg( errno ). |
423 | arg( strerror(errno) ) ); | 423 | arg( strerror(errno) ) ); |
424 | } | 424 | } |
425 | return; | 425 | return; |
426 | } | 426 | } |
427 | reinit(); | 427 | reinit(); |
428 | } | 428 | } |
429 | } | 429 | } |
430 | 430 | ||
431 | void OTDriver::setScanMode(bool iscan, bool pscan) { | 431 | void OTDriver::setScanMode(bool iscan, bool pscan) { |
432 | 432 | ||
433 | struct hci_dev_req dr; | 433 | struct hci_dev_req dr; |
434 | 434 | ||
435 | if( ! open() ) { | 435 | if( ! open() ) { |
436 | return; | 436 | return; |
437 | } | 437 | } |
438 | 438 | ||
439 | dr.dev_id = devId(); | 439 | dr.dev_id = devId(); |
440 | dr.dev_opt = SCAN_DISABLED; | 440 | dr.dev_opt = SCAN_DISABLED; |
441 | 441 | ||
442 | if( iscan&&(!pscan) ) | 442 | if( iscan&&(!pscan) ) |
443 | dr.dev_opt = SCAN_INQUIRY; | 443 | dr.dev_opt = SCAN_INQUIRY; |
444 | else if( pscan&&(!iscan) ) | 444 | else if( pscan&&(!iscan) ) |
445 | dr.dev_opt = SCAN_PAGE; | 445 | dr.dev_opt = SCAN_PAGE; |
446 | else if( pscan&&iscan ) | 446 | else if( pscan&&iscan ) |
447 | dr.dev_opt = SCAN_PAGE | SCAN_INQUIRY; | 447 | dr.dev_opt = SCAN_PAGE | SCAN_INQUIRY; |
448 | 448 | ||
449 | if( ioctl(fd(), HCISETSCAN, (unsigned long)&dr) < 0 ) { | 449 | if( ioctl(fd(), HCISETSCAN, (unsigned long)&dr) < 0 ) { |
450 | if( errno != EALREADY ) { | 450 | if( errno != EALREADY ) { |
451 | emit error( tr( "Can't set scan mode on %1. %2 : %3" ). | 451 | emit error( tr( "Can't set scan mode on %1. %2 : %3" ). |
452 | arg( devname() ). | 452 | arg( devname() ). |
453 | arg( errno ). | 453 | arg( errno ). |
454 | arg( strerror(errno) ) ); | 454 | arg( strerror(errno) ) ); |
455 | } | 455 | } |
456 | return; | 456 | return; |
457 | } | 457 | } |
458 | 458 | ||
459 | reinit(); | 459 | reinit(); |
460 | } | 460 | } |
461 | 461 | ||
462 | void OTDriver::changeDevName(const char* name) { | 462 | void OTDriver::changeDevName(const char* name) { |
463 | 463 | ||
464 | if( ! open() ) { | 464 | if( ! open() ) { |
465 | return; | 465 | return; |
466 | } | 466 | } |
467 | 467 | ||
468 | if (hci_write_local_name(fd(), name, 1000) < 0) { | 468 | if (hci_write_local_name(fd(), name, 1000) < 0) { |
469 | emit error( tr( "Can't change local name on %1. %2 : %3" ). | 469 | emit error( tr( "Can't change local name on %1. %2 : %3" ). |
470 | arg( devname() ). | 470 | arg( devname() ). |
471 | arg( errno ). | 471 | arg( errno ). |
472 | arg( strerror(errno) ) ); | 472 | arg( strerror(errno) ) ); |
473 | } | 473 | } |
474 | } | 474 | } |
475 | 475 | ||
476 | void OTDriver::changeAuthentication(bool _auth) { | 476 | void OTDriver::changeAuthentication(bool _auth) { |
477 | struct hci_dev_req dr; | 477 | struct hci_dev_req dr; |
478 | 478 | ||
479 | if( ! open() ) { | 479 | if( ! open() ) { |
480 | return; | 480 | return; |
481 | } | 481 | } |
482 | 482 | ||
483 | dr.dev_id = devId(); | 483 | dr.dev_id = devId(); |
484 | dr.dev_opt = _auth?AUTH_ENABLED:AUTH_DISABLED; | 484 | dr.dev_opt = _auth?AUTH_ENABLED:AUTH_DISABLED; |
485 | 485 | ||
486 | if (ioctl(fd(),HCISETAUTH,(unsigned long)&dr) < 0) { | 486 | if (ioctl(fd(),HCISETAUTH,(unsigned long)&dr) < 0) { |
487 | if( errno != EALREADY ) { | 487 | if( errno != EALREADY ) { |
488 | emit error( tr( "Can't change authentication on %1. %2 : %3" ). | 488 | emit error( tr( "Can't change authentication on %1. %2 : %3" ). |
489 | arg( devname() ). | 489 | arg( devname() ). |
490 | arg( errno ). | 490 | arg( errno ). |
491 | arg( strerror(errno) ) ); | 491 | arg( strerror(errno) ) ); |
492 | } | 492 | } |
493 | return; | 493 | return; |
494 | } | 494 | } |
495 | reinit(); | 495 | reinit(); |
496 | } | 496 | } |
497 | 497 | ||
498 | void OTDriver::changeEncryption(bool _encrypt) { | 498 | void OTDriver::changeEncryption(bool _encrypt) { |
499 | struct hci_dev_req dr; | 499 | struct hci_dev_req dr; |
500 | 500 | ||
501 | if( ! open() ) { | 501 | if( ! open() ) { |
502 | return; | 502 | return; |
503 | } | 503 | } |
504 | 504 | ||
505 | dr.dev_id = devId(); | 505 | dr.dev_id = devId(); |
506 | dr.dev_opt = _encrypt?ENCRYPT_P2P:ENCRYPT_DISABLED; | 506 | dr.dev_opt = _encrypt?ENCRYPT_P2P:ENCRYPT_DISABLED; |
507 | 507 | ||
508 | if (ioctl(fd(),HCISETENCRYPT,(unsigned long)&dr) < 0) { | 508 | if (ioctl(fd(),HCISETENCRYPT,(unsigned long)&dr) < 0) { |
509 | if( errno != EALREADY ) { | 509 | if( errno != EALREADY ) { |
510 | emit error( tr( "Can't change encryption on %1. %2 : %3" ). | 510 | emit error( tr( "Can't change encryption on %1. %2 : %3" ). |
511 | arg( devname() ). | 511 | arg( devname() ). |
512 | arg( errno ). | 512 | arg( errno ). |
513 | arg( strerror(errno) ) ); | 513 | arg( strerror(errno) ) ); |
514 | } | 514 | } |
515 | return; | 515 | return; |
516 | } | 516 | } |
517 | 517 | ||
518 | reinit(); | 518 | reinit(); |
519 | } | 519 | } |
520 | 520 | ||
521 | void OTDriver::changeClass ( unsigned char service, | 521 | void OTDriver::changeClass ( unsigned char service, |
522 | unsigned char major, | 522 | unsigned char major, |
523 | unsigned char minor ) { | 523 | unsigned char minor ) { |
524 | unsigned long cod = 0; | 524 | unsigned long cod = 0; |
525 | cod = (service << 16) | | 525 | cod = (service << 16) | |
526 | (major << 8) | | 526 | (major << 8) | |
527 | (minor ) ; | 527 | (minor ) ; |
528 | 528 | ||
529 | if( ! open() ) { | 529 | if( ! open() ) { |
530 | return; | 530 | return; |
531 | } | 531 | } |
532 | 532 | ||
533 | if ( hci_write_class_of_dev(fd(),cod,1000) < 0 ) { | 533 | if ( hci_write_class_of_dev(fd(),cod,1000) < 0 ) { |
534 | emit error( tr( "Can't change class informations for %1. %2 : %3" ). | 534 | emit error( tr( "Can't change class informations for %1. %2 : %3" ). |
535 | arg( devname() ). | 535 | arg( devname() ). |
536 | arg( errno ). | 536 | arg( errno ). |
537 | arg( strerror(errno) ) ); | 537 | arg( strerror(errno) ) ); |
538 | return; | 538 | return; |
539 | } | 539 | } |
540 | } | 540 | } |
541 | 541 | ||
542 | void OTDriver::getClass( QString & service, | 542 | void OTDriver::getClass( QString & service, |
543 | QString & device ) { | 543 | QString & device ) { |
544 | unsigned char cls[3]; | 544 | unsigned char cls[3]; |
545 | 545 | ||
546 | if( ! open() ) { | 546 | if( ! open() ) { |
547 | return; | 547 | return; |
548 | } | 548 | } |
549 | 549 | ||
550 | if ( hci_read_class_of_dev(fd(),cls,1000) < 0 ) { | 550 | if ( hci_read_class_of_dev(fd(),cls,1000) < 0 ) { |
551 | emit error( tr( "Can't read class information for %1. %2 : %3" ). | 551 | emit error( tr( "Can't read class information for %1. %2 : %3" ). |
552 | arg( devname() ). | 552 | arg( devname() ). |
553 | arg( errno ). | 553 | arg( errno ). |
554 | arg( strerror(errno) ) ); | 554 | arg( strerror(errno) ) ); |
555 | return; | 555 | return; |
556 | } | 556 | } |
557 | 557 | ||
558 | if( cls[2] ) { | 558 | if( cls[2] ) { |
559 | int first = 1; | 559 | int first = 1; |
560 | for ( unsigned int s = 0; s < sizeof(*services); s++) { | 560 | for ( unsigned int s = 0; s < sizeof(*services); s++) { |
561 | if (cls[2] & (1 << s)) { | 561 | if (cls[2] & (1 << s)) { |
562 | if( !first ) | 562 | if( !first ) |
563 | service += ", "; | 563 | service += ", "; |
564 | service += services[s]; | 564 | service += services[s]; |
565 | first = 0; | 565 | first = 0; |
566 | } | 566 | } |
567 | } | 567 | } |
568 | } else { | 568 | } else { |
569 | service = "unspecified"; | 569 | service = "unspecified"; |
570 | } | 570 | } |
571 | 571 | ||
572 | MainClassMap_t * MCM = MainClasses; | 572 | MainClassMap_t * MCM = MainClasses; |
573 | int major = cls[1] & 0x1f; | 573 | int major = cls[1] & 0x1f; |
574 | int minor = cls[0] >> 2; | 574 | int minor = cls[0] >> 2; |
575 | 575 | ||
576 | if( (unsigned)(cls[1] & 0x1f) > sizeof(*major_devices)) { | 576 | if( (unsigned)(cls[1] & 0x1f) > sizeof(*major_devices)) { |
577 | device = tr("Invalid Device Class"); | 577 | device = tr("Invalid Device Class"); |
578 | return; | 578 | return; |
579 | } | 579 | } |
580 | 580 | ||
581 | device = major_devices[cls[1] & 0x1f]; | 581 | device = major_devices[cls[1] & 0x1f]; |
582 | 582 | ||
583 | while( MCM->Major != -1 ) { | 583 | while( MCM->Major != -1 ) { |
584 | if( major == MCM->Major ) { | 584 | if( major == MCM->Major ) { |
585 | // this class | 585 | // this class |
586 | ClassMap_t * CM = MCM->Map; | 586 | ClassMap_t * CM = MCM->Map; |
587 | if( MCM->Map ) { | 587 | if( MCM->Map ) { |
588 | while( CM->Minor != -1 ) { | 588 | while( CM->Minor != -1 ) { |
589 | if( minor == CM->Minor ) { | 589 | if( minor == CM->Minor ) { |
590 | break; | 590 | break; |
591 | } | 591 | } |
592 | CM ++; | 592 | CM ++; |
593 | } | 593 | } |
594 | device = CM->Description; | 594 | device = CM->Description; |
595 | } else { | 595 | } else { |
596 | // special case | 596 | // special case |
597 | if( major == 3 ) { | 597 | if( major == 3 ) { |
598 | /* lan access */ | 598 | /* lan access */ |
599 | if( minor == 0 ) { | 599 | if( minor == 0 ) { |
600 | device = "Uncategorized"; | 600 | device = "Uncategorized"; |
601 | } else { | 601 | } else { |
602 | switch( minor / 8 ) { | 602 | switch( minor / 8 ) { |
603 | case 0: | 603 | case 0: |
604 | device = "Fully available"; | 604 | device = "Fully available"; |
605 | break; | 605 | break; |
606 | case 1: | 606 | case 1: |
607 | device = "1-17% utilized"; | 607 | device = "1-17% utilized"; |
608 | break; | 608 | break; |
609 | case 2: | 609 | case 2: |
610 | device = "17-33% utilized"; | 610 | device = "17-33% utilized"; |
611 | break; | 611 | break; |
612 | case 3: | 612 | case 3: |
613 | device = "33-50% utilized"; | 613 | device = "33-50% utilized"; |
614 | break; | 614 | break; |
615 | case 4: | 615 | case 4: |
616 | device = "50-67% utilized"; | 616 | device = "50-67% utilized"; |
617 | break; | 617 | break; |
618 | case 5: | 618 | case 5: |
619 | device = "67-83% utilized"; | 619 | device = "67-83% utilized"; |
620 | break; | 620 | break; |
621 | case 6: | 621 | case 6: |
622 | device = "83-99% utilized"; | 622 | device = "83-99% utilized"; |
623 | break; | 623 | break; |
624 | case 7: | 624 | case 7: |
625 | device = "No service available"; | 625 | device = "No service available"; |
626 | break; | 626 | break; |
627 | } | 627 | } |
628 | } | 628 | } |
629 | } else if( major == 6 ) { /* imaging */ | 629 | } else if( major == 6 ) { /* imaging */ |
630 | if (minor & 4) | 630 | if (minor & 4) |
631 | device = "Display"; | 631 | device = "Display"; |
632 | if (minor & 8) | 632 | if (minor & 8) |
633 | device = "Camera"; | 633 | device = "Camera"; |
634 | if (minor & 16) | 634 | if (minor & 16) |
635 | device = "Scanner"; | 635 | device = "Scanner"; |
636 | if (minor & 32) | 636 | if (minor & 32) |
637 | device = "Printer"; | 637 | device = "Printer"; |
638 | } | 638 | } |
639 | } | 639 | } |
640 | break; | 640 | break; |
641 | } | 641 | } |
642 | MCM ++; | 642 | MCM ++; |
643 | } | 643 | } |
644 | 644 | ||
645 | if( MCM->Major == -1 ) { | 645 | if( MCM->Major == -1 ) { |
646 | device = "Unknown (reserved) minor device class"; | 646 | device = "Unknown (reserved) minor device class"; |
647 | } | 647 | } |
648 | } | 648 | } |
649 | 649 | ||
650 | QString OTDriver::strType() { | 650 | QString OTDriver::strType() { |
651 | return QString( hci_dtypetostr(Type) ); | 651 | return QString( hci_dtypetostr(Type) ); |
652 | } | 652 | } |
653 | 653 | ||
654 | void OTDriver::setFeatures( unsigned char * _f) { | 654 | void OTDriver::setFeatures( unsigned char * _f) { |
655 | Features = lmp_featurestostr(_f, NULL, 255); | 655 | Features = lmp_featurestostr(_f, NULL, 255); |
656 | } | 656 | } |
657 | 657 | ||
658 | void OTDriver::setManufacturer(int compid) { | 658 | void OTDriver::setManufacturer(int compid) { |
659 | Manufacturer = bt_compidtostr(compid); | 659 | Manufacturer = bt_compidtostr(compid); |
660 | } | 660 | } |
661 | 661 | ||
662 | OTHCISocket * OTDriver::openSocket( void ) { | 662 | OTHCISocket * OTDriver::openSocket( void ) { |
663 | if( ! Socket ) { | 663 | if( ! Socket ) { |
664 | owarn << "Open HCI socket to " << devname() << oendl; | 664 | odebug << "Open HCI socket to " << devname() << oendl; |
665 | Socket = new OTHCISocket( this ); | 665 | Socket = new OTHCISocket( this ); |
666 | } | 666 | } |
667 | return Socket; | 667 | return Socket; |
668 | } | 668 | } |
669 | 669 | ||
670 | void OTDriver::closeSocket( void ) { | 670 | void OTDriver::closeSocket( void ) { |
671 | if( Socket ) { | 671 | if( Socket ) { |
672 | owarn << "Close HCI socket to " << devname() << oendl; | 672 | odebug << "Close HCI socket to " << devname() << oendl; |
673 | delete Socket; | 673 | delete Socket; |
674 | Socket = 0; | 674 | Socket = 0; |
675 | } | 675 | } |
676 | } | 676 | } |
677 | 677 | ||
678 | QString OTDriver::getPeerName( const OTDeviceAddress & PAddr ) { | 678 | QString OTDriver::getPeerName( const OTDeviceAddress & PAddr ) { |
679 | QString S; | 679 | QString S; |
680 | char name[100 ]; | 680 | char name[100 ]; |
681 | 681 | ||
682 | if( ! open() ) { | 682 | if( ! open() ) { |
683 | return QString("N/A"); | 683 | return QString("N/A"); |
684 | } | 684 | } |
685 | 685 | ||
686 | if( hci_read_remote_name( fd(), | 686 | if( hci_read_remote_name( fd(), |
687 | &(PAddr.getBDAddr()), | 687 | &(PAddr.getBDAddr()), |
688 | sizeof(name), | 688 | sizeof(name), |
689 | name, | 689 | name, |
690 | 100000 ) < 0 ) { | 690 | 100000 ) < 0 ) { |
691 | return QString( "N/A" ); | 691 | return QString( "N/A" ); |
692 | } | 692 | } |
693 | 693 | ||
694 | return QString( name ); | 694 | return QString( name ); |
695 | } | 695 | } |
696 | 696 | ||
697 | long OTDriver::getLinkQuality( const OTDeviceAddress & Addr ) { | 697 | long OTDriver::getLinkQuality( const OTDeviceAddress & Addr ) { |
698 | struct hci_conn_info_req *cr; | 698 | struct hci_conn_info_req *cr; |
699 | struct hci_request rq; | 699 | struct hci_request rq; |
700 | read_rssi_rp rp; | 700 | read_rssi_rp rp; |
701 | uint16_t handle; | 701 | uint16_t handle; |
702 | 702 | ||
703 | if( ! open() ) { | 703 | if( ! open() ) { |
704 | return 0; | 704 | return 0; |
705 | } | 705 | } |
706 | 706 | ||
707 | cr = (struct hci_conn_info_req *)malloc( | 707 | cr = (struct hci_conn_info_req *)malloc( |
708 | sizeof(*cr) + sizeof(struct hci_conn_info)); | 708 | sizeof(*cr) + sizeof(struct hci_conn_info)); |
709 | if (!cr) | 709 | if (!cr) |
710 | return 0; | 710 | return 0; |
711 | 711 | ||
712 | bacpy( &(cr->bdaddr), &(Addr.getBDAddr()) ); | 712 | bacpy( &(cr->bdaddr), &(Addr.getBDAddr()) ); |
713 | cr->type = ACL_LINK; | 713 | cr->type = ACL_LINK; |
714 | 714 | ||
715 | if (ioctl( fd(), HCIGETCONNINFO, (unsigned long) cr) < 0) { | 715 | if (ioctl( fd(), HCIGETCONNINFO, (unsigned long) cr) < 0) { |
716 | owarn << "Get connection info failed" << oendl; | 716 | odebug << "Get connection info failed" << oendl; |
717 | free(cr); | 717 | free(cr); |
718 | return 0; | 718 | return 0; |
719 | } | 719 | } |
720 | 720 | ||
721 | handle = htobs(cr->conn_info->handle); | 721 | handle = htobs(cr->conn_info->handle); |
722 | 722 | ||
723 | free(cr); | 723 | free(cr); |
724 | 724 | ||
725 | memset(&rq, 0, sizeof(rq)); | 725 | memset(&rq, 0, sizeof(rq)); |
726 | rq.ogf = OGF_STATUS_PARAM; | 726 | rq.ogf = OGF_STATUS_PARAM; |
727 | rq.ocf = OCF_READ_RSSI; | 727 | rq.ocf = OCF_READ_RSSI; |
728 | rq.cparam = &handle; | 728 | rq.cparam = &handle; |
729 | rq.clen = 2; | 729 | rq.clen = 2; |
730 | rq.rparam = &rp; | 730 | rq.rparam = &rp; |
731 | rq.rlen = GET_LINK_QUALITY_RP_SIZE; | 731 | rq.rlen = GET_LINK_QUALITY_RP_SIZE; |
732 | 732 | ||
733 | if (hci_send_req( fd(), &rq, 100) < 0) { | 733 | if (hci_send_req( fd(), &rq, 100) < 0) { |
734 | owarn << "Get connection info failed" << oendl; | 734 | odebug << "Get connection info failed" << oendl; |
735 | return 0; | 735 | return 0; |
736 | } | 736 | } |
737 | 737 | ||
738 | if( rp.status ) { | 738 | if( rp.status ) { |
739 | owarn << QString().sprintf("HCI get_link_quality cmd failed (0x%2.2X)", rp.status) << oendl; | 739 | odebug << QString().sprintf("HCI get_link_quality cmd failed (0x%2.2X)", rp.status) << oendl; |
740 | return 0; | 740 | return 0; |
741 | } | 741 | } |
742 | 742 | ||
743 | return rp.rssi+50; | 743 | return rp.rssi+50; |
744 | } | 744 | } |
diff --git a/noncore/settings/networksettings2/opietooth2/OTDriverList.cpp b/noncore/settings/networksettings2/opietooth2/OTDriverList.cpp index f703834..e5af742 100644 --- a/noncore/settings/networksettings2/opietooth2/OTDriverList.cpp +++ b/noncore/settings/networksettings2/opietooth2/OTDriverList.cpp | |||
@@ -1,86 +1,86 @@ | |||
1 | /*************************************************************************** | 1 | /*************************************************************************** |
2 | * Copyright (C) 2003 by Mattia Merzi * | 2 | * Copyright (C) 2003 by Mattia Merzi * |
3 | * ottobit@ferrara.linux.it * | 3 | * ottobit@ferrara.linux.it * |
4 | * * | 4 | * * |
5 | * This program is free software; you can redistribute it and/or modify * | 5 | * This program is free software; you can redistribute it and/or modify * |
6 | * it under the terms of the GNU General Public License as published by * | 6 | * it under the terms of the GNU General Public License as published by * |
7 | * the Free Software Foundation; either version 2 of the License, or * | 7 | * the Free Software Foundation; either version 2 of the License, or * |
8 | * (at your option) any later version. * | 8 | * (at your option) any later version. * |
9 | ***************************************************************************/ | 9 | ***************************************************************************/ |
10 | 10 | ||
11 | #include <malloc.h> | 11 | #include <malloc.h> |
12 | #include <bluezlib.h> | 12 | #include <bluezlib.h> |
13 | 13 | ||
14 | #include <opie2/odebug.h> | 14 | #include <opie2/odebug.h> |
15 | 15 | ||
16 | #include <OTDriverList.h> | 16 | #include <OTDriverList.h> |
17 | #include <OTGateway.h> | 17 | #include <OTGateway.h> |
18 | #include <OTDriver.h> | 18 | #include <OTDriver.h> |
19 | 19 | ||
20 | using namespace Opietooth2; | 20 | using namespace Opietooth2; |
21 | 21 | ||
22 | OTDriverList::OTDriverList( OTGateway * _OT ) : QVector<OTDriver>() { | 22 | OTDriverList::OTDriverList( OTGateway * _OT ) : QVector<OTDriver>() { |
23 | 23 | ||
24 | OT = _OT; | 24 | OT = _OT; |
25 | setAutoDelete( true ); | 25 | setAutoDelete( true ); |
26 | } | 26 | } |
27 | 27 | ||
28 | OTDriverList::~OTDriverList() { | 28 | OTDriverList::~OTDriverList() { |
29 | } | 29 | } |
30 | 30 | ||
31 | void OTDriverList::update() { | 31 | void OTDriverList::update() { |
32 | 32 | ||
33 | struct hci_dev_list_req *dl; | 33 | struct hci_dev_list_req *dl; |
34 | struct hci_dev_req *dr; | 34 | struct hci_dev_req *dr; |
35 | struct hci_dev_info di; | 35 | struct hci_dev_info di; |
36 | int cur; | 36 | int cur; |
37 | 37 | ||
38 | dl = 0; | 38 | dl = 0; |
39 | cur = 0; | 39 | cur = 0; |
40 | do { | 40 | do { |
41 | cur += 5; | 41 | cur += 5; |
42 | 42 | ||
43 | dl = (struct hci_dev_list_req*) | 43 | dl = (struct hci_dev_list_req*) |
44 | ::realloc( dl, sizeof( struct hci_dev_list_req ) + | 44 | ::realloc( dl, sizeof( struct hci_dev_list_req ) + |
45 | ( cur * sizeof(struct hci_dev_req) ) | 45 | ( cur * sizeof(struct hci_dev_req) ) |
46 | ); | 46 | ); |
47 | 47 | ||
48 | if( dl == 0 ) { | 48 | if( dl == 0 ) { |
49 | // memory problem | 49 | // memory problem |
50 | exit(1); | 50 | exit(1); |
51 | } | 51 | } |
52 | 52 | ||
53 | dl->dev_num = cur; | 53 | dl->dev_num = cur; |
54 | 54 | ||
55 | if( ioctl( OT->getSocket(), HCIGETDEVLIST, (void*)dl) ) { | 55 | if( ioctl( OT->getSocket(), HCIGETDEVLIST, (void*)dl) ) { |
56 | owarn << "WARNING : cannot read device list. " | 56 | odebug << "WARNING : cannot read device list. " |
57 | << errno | 57 | << errno |
58 | << strerror( errno ) << oendl; | 58 | << strerror( errno ) << oendl; |
59 | return; | 59 | return; |
60 | } | 60 | } |
61 | 61 | ||
62 | // if num == cur perhaps we did not get all devices yet | 62 | // if num == cur perhaps we did not get all devices yet |
63 | } while( dl->dev_num == cur ); | 63 | } while( dl->dev_num == cur ); |
64 | 64 | ||
65 | if( dl->dev_num != count() ) { | 65 | if( dl->dev_num != count() ) { |
66 | // new or missing devices | 66 | // new or missing devices |
67 | clear(); | 67 | clear(); |
68 | 68 | ||
69 | dr = dl->dev_req; | 69 | dr = dl->dev_req; |
70 | resize( dl->dev_num ); | 70 | resize( dl->dev_num ); |
71 | 71 | ||
72 | for( cur=0; cur < dl->dev_num; cur ++) { | 72 | for( cur=0; cur < dl->dev_num; cur ++) { |
73 | memset( &di, 0, sizeof( di ) ); | 73 | memset( &di, 0, sizeof( di ) ); |
74 | di.dev_id = (dr+cur)->dev_id; | 74 | di.dev_id = (dr+cur)->dev_id; |
75 | 75 | ||
76 | // get device info | 76 | // get device info |
77 | if( ioctl( OT->getSocket(), HCIGETDEVINFO, (void*)&di) != 0 ) | 77 | if( ioctl( OT->getSocket(), HCIGETDEVINFO, (void*)&di) != 0 ) |
78 | continue; // uh ? | 78 | continue; // uh ? |
79 | insert( cur, new OTDriver( OT, &di ) ); | 79 | insert( cur, new OTDriver( OT, &di ) ); |
80 | } | 80 | } |
81 | 81 | ||
82 | owarn << "Found " << count() << " devices" << oendl; | 82 | odebug << "Found " << count() << " devices" << oendl; |
83 | 83 | ||
84 | ::free( dl ); | 84 | ::free( dl ); |
85 | } | 85 | } |
86 | } | 86 | } |
diff --git a/noncore/settings/networksettings2/opietooth2/OTGateway.cpp b/noncore/settings/networksettings2/opietooth2/OTGateway.cpp index 6531cf6..e8137dd 100644 --- a/noncore/settings/networksettings2/opietooth2/OTGateway.cpp +++ b/noncore/settings/networksettings2/opietooth2/OTGateway.cpp | |||
@@ -1,773 +1,773 @@ | |||
1 | #include <qmessagebox.h> | 1 | #include <qmessagebox.h> |
2 | #include <qfile.h> | 2 | #include <qfile.h> |
3 | #include <qdir.h> | 3 | #include <qdir.h> |
4 | #include <qtextstream.h> | 4 | #include <qtextstream.h> |
5 | #include <qpixmap.h> | 5 | #include <qpixmap.h> |
6 | #include <qvector.h> | 6 | #include <qvector.h> |
7 | #include <qpe/resource.h> | 7 | #include <qpe/resource.h> |
8 | 8 | ||
9 | #include <opie2/odebug.h> | 9 | #include <opie2/odebug.h> |
10 | 10 | ||
11 | #include <bluezlib.h> | 11 | #include <bluezlib.h> |
12 | 12 | ||
13 | #include <OTDevice.h> | 13 | #include <OTDevice.h> |
14 | #include <OTDriver.h> | 14 | #include <OTDriver.h> |
15 | #include <OTInquiry.h> | 15 | #include <OTInquiry.h> |
16 | #include <OTDriverList.h> | 16 | #include <OTDriverList.h> |
17 | #include <OTDeviceAddress.h> | 17 | #include <OTDeviceAddress.h> |
18 | #include <OTGateway.h> | 18 | #include <OTGateway.h> |
19 | 19 | ||
20 | using namespace Opietooth2; | 20 | using namespace Opietooth2; |
21 | 21 | ||
22 | // single instance | 22 | // single instance |
23 | OTGateway * OTGateway::SingleGateway = 0; | 23 | OTGateway * OTGateway::SingleGateway = 0; |
24 | int OTGateway::UseCount = 0; | 24 | int OTGateway::UseCount = 0; |
25 | 25 | ||
26 | OTGateway * OTGateway::getOTGateway( void ) { | 26 | OTGateway * OTGateway::getOTGateway( void ) { |
27 | if(SingleGateway == 0 ) { | 27 | if(SingleGateway == 0 ) { |
28 | SingleGateway = new OTGateway(); | 28 | SingleGateway = new OTGateway(); |
29 | } | 29 | } |
30 | 30 | ||
31 | UseCount ++; | 31 | UseCount ++; |
32 | return SingleGateway; | 32 | return SingleGateway; |
33 | } | 33 | } |
34 | 34 | ||
35 | void OTGateway::releaseOTGateway( void ) { | 35 | void OTGateway::releaseOTGateway( void ) { |
36 | UseCount --; | 36 | UseCount --; |
37 | if( UseCount == 0 ) { | 37 | if( UseCount == 0 ) { |
38 | delete SingleGateway; | 38 | delete SingleGateway; |
39 | SingleGateway = 0; | 39 | SingleGateway = 0; |
40 | } | 40 | } |
41 | } | 41 | } |
42 | 42 | ||
43 | // open bluetooth system | 43 | // open bluetooth system |
44 | OTGateway::OTGateway( void ) : QObject( 0, "OTGateway" ), | 44 | OTGateway::OTGateway( void ) : QObject( 0, "OTGateway" ), |
45 | AllDrivers( this ), | 45 | AllDrivers( this ), |
46 | AllPeers() { | 46 | AllPeers() { |
47 | 47 | ||
48 | ErrorConnectCount = 0; | 48 | ErrorConnectCount = 0; |
49 | TheOTDevice = 0; | 49 | TheOTDevice = 0; |
50 | Scanning = 0; | 50 | Scanning = 0; |
51 | AllPeersModified = 0; | 51 | AllPeersModified = 0; |
52 | AllPeers.setAutoDelete( TRUE ); | 52 | AllPeers.setAutoDelete( TRUE ); |
53 | 53 | ||
54 | if ( ( HciCtl = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)) < 0) { | 54 | if ( ( HciCtl = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)) < 0) { |
55 | SLOT_ShowError( tr( "error opening hci socket" ) ); | 55 | SLOT_ShowError( tr( "error opening hci socket" ) ); |
56 | return; | 56 | return; |
57 | } | 57 | } |
58 | 58 | ||
59 | // load all known devices | 59 | // load all known devices |
60 | updateDrivers(); | 60 | updateDrivers(); |
61 | 61 | ||
62 | // load all peers we have ever seen | 62 | // load all peers we have ever seen |
63 | loadKnownPeers(); | 63 | loadKnownPeers(); |
64 | 64 | ||
65 | // iterate over drivers and find active connections | 65 | // iterate over drivers and find active connections |
66 | // adding/updating peers | 66 | // adding/updating peers |
67 | loadActiveConnections(); | 67 | loadActiveConnections(); |
68 | 68 | ||
69 | // check every 4 seconds the state of BT | 69 | // check every 4 seconds the state of BT |
70 | timerEvent(0); | 70 | timerEvent(0); |
71 | RefreshTimer = -1; | 71 | RefreshTimer = -1; |
72 | setRefreshTimer( 4000 ); | 72 | setRefreshTimer( 4000 ); |
73 | 73 | ||
74 | // load known link keys | 74 | // load known link keys |
75 | readLinkKeys(); | 75 | readLinkKeys(); |
76 | } | 76 | } |
77 | 77 | ||
78 | // close bluetooth system | 78 | // close bluetooth system |
79 | OTGateway::~OTGateway( void ) { | 79 | OTGateway::~OTGateway( void ) { |
80 | 80 | ||
81 | if( AllPeersModified ) { | 81 | if( AllPeersModified ) { |
82 | saveKnownPeers(); | 82 | saveKnownPeers(); |
83 | } | 83 | } |
84 | 84 | ||
85 | if( Scanning ) | 85 | if( Scanning ) |
86 | delete Scanning; | 86 | delete Scanning; |
87 | 87 | ||
88 | if( TheOTDevice ) | 88 | if( TheOTDevice ) |
89 | delete TheOTDevice; | 89 | delete TheOTDevice; |
90 | 90 | ||
91 | if( HciCtl >= 0 ) { | 91 | if( HciCtl >= 0 ) { |
92 | ::close( HciCtl ); | 92 | ::close( HciCtl ); |
93 | } | 93 | } |
94 | } | 94 | } |
95 | 95 | ||
96 | void OTGateway::setRefreshTimer( int T ) { | 96 | void OTGateway::setRefreshTimer( int T ) { |
97 | if( RefreshTimer != -1 ) { | 97 | if( RefreshTimer != -1 ) { |
98 | killTimer( RefreshTimer ); | 98 | killTimer( RefreshTimer ); |
99 | } | 99 | } |
100 | 100 | ||
101 | if( T == 0 ) | 101 | if( T == 0 ) |
102 | T = 4000; | 102 | T = 4000; |
103 | RefreshTimer = startTimer( T ); | 103 | RefreshTimer = startTimer( T ); |
104 | } | 104 | } |
105 | 105 | ||
106 | OTDevice * OTGateway::getOTDevice( ) { | 106 | OTDevice * OTGateway::getOTDevice( ) { |
107 | if( TheOTDevice == 0 ) { | 107 | if( TheOTDevice == 0 ) { |
108 | // load bluetooth device and check state | 108 | // load bluetooth device and check state |
109 | TheOTDevice = new OTDevice( this ); | 109 | TheOTDevice = new OTDevice( this ); |
110 | connect( TheOTDevice, | 110 | connect( TheOTDevice, |
111 | SIGNAL( isEnabled( int, bool ) ), | 111 | SIGNAL( isEnabled( int, bool ) ), |
112 | this, | 112 | this, |
113 | SLOT( SLOT_Enabled( int, bool ) ) ); | 113 | SLOT( SLOT_Enabled( int, bool ) ) ); |
114 | 114 | ||
115 | connect( TheOTDevice, | 115 | connect( TheOTDevice, |
116 | SIGNAL( error( const QString & ) ), | 116 | SIGNAL( error( const QString & ) ), |
117 | this, | 117 | this, |
118 | SLOT( SLOT_ShowError( const QString & ) ) ); | 118 | SLOT( SLOT_ShowError( const QString & ) ) ); |
119 | } | 119 | } |
120 | 120 | ||
121 | return TheOTDevice; | 121 | return TheOTDevice; |
122 | } | 122 | } |
123 | 123 | ||
124 | // start bluetooth (if stopped) | 124 | // start bluetooth (if stopped) |
125 | // return TRUE if started | 125 | // return TRUE if started |
126 | void OTGateway::SLOT_SetEnabled( bool Mode ) { | 126 | void OTGateway::SLOT_SetEnabled( bool Mode ) { |
127 | if( Mode ) { | 127 | if( Mode ) { |
128 | SLOT_Enable(); | 128 | SLOT_Enable(); |
129 | return; | 129 | return; |
130 | } | 130 | } |
131 | SLOT_Disable(); | 131 | SLOT_Disable(); |
132 | } | 132 | } |
133 | 133 | ||
134 | void OTGateway::SLOT_Enable() { | 134 | void OTGateway::SLOT_Enable() { |
135 | getOTDevice()->attach(); | 135 | getOTDevice()->attach(); |
136 | } | 136 | } |
137 | 137 | ||
138 | void OTGateway::SLOT_Disable() { | 138 | void OTGateway::SLOT_Disable() { |
139 | getOTDevice()->detach(); | 139 | getOTDevice()->detach(); |
140 | } | 140 | } |
141 | 141 | ||
142 | bool OTGateway::needsEnabling() { | 142 | bool OTGateway::needsEnabling() { |
143 | return getOTDevice()->needsAttach(); | 143 | return getOTDevice()->needsAttach(); |
144 | } | 144 | } |
145 | 145 | ||
146 | bool OTGateway::isEnabled() { | 146 | bool OTGateway::isEnabled() { |
147 | if( getOTDevice()->deviceNr() >= 0 && | 147 | if( getOTDevice()->deviceNr() >= 0 && |
148 | driver( getOTDevice()->deviceNr() )->isUp() ) | 148 | driver( getOTDevice()->deviceNr() )->isUp() ) |
149 | return TRUE; | 149 | return TRUE; |
150 | 150 | ||
151 | // else check system | 151 | // else check system |
152 | return getOTDevice()->isAttached(); | 152 | return getOTDevice()->isAttached(); |
153 | } | 153 | } |
154 | 154 | ||
155 | void OTGateway::SLOT_ShowError( const QString & S ) { | 155 | void OTGateway::SLOT_ShowError( const QString & S ) { |
156 | 156 | ||
157 | owarn << S << oendl; | 157 | odebug << S << oendl; |
158 | 158 | ||
159 | if( ErrorConnectCount > 0 ) { | 159 | if( ErrorConnectCount > 0 ) { |
160 | // pass error | 160 | // pass error |
161 | emit error( QString( "<p>" ) + S + "</p>" ); | 161 | emit error( QString( "<p>" ) + S + "</p>" ); |
162 | return; | 162 | return; |
163 | } | 163 | } |
164 | 164 | ||
165 | QMessageBox::warning( 0, | 165 | QMessageBox::warning( 0, |
166 | tr("OTGateway error"), | 166 | tr("OTGateway error"), |
167 | S ); | 167 | S ); |
168 | } | 168 | } |
169 | 169 | ||
170 | void OTGateway::connectNotify( const char * S ) { | 170 | void OTGateway::connectNotify( const char * S ) { |
171 | if( S && strcmp( S, "error(const QString&)" ) == 0 ) { | 171 | if( S && strcmp( S, "error(const QString&)" ) == 0 ) { |
172 | ErrorConnectCount ++; | 172 | ErrorConnectCount ++; |
173 | } | 173 | } |
174 | } | 174 | } |
175 | 175 | ||
176 | void OTGateway::disconnectNotify( const char * S ) { | 176 | void OTGateway::disconnectNotify( const char * S ) { |
177 | if( S && strcmp( S, "error(const QString&)" ) == 0 ) { | 177 | if( S && strcmp( S, "error(const QString&)" ) == 0 ) { |
178 | ErrorConnectCount --; | 178 | ErrorConnectCount --; |
179 | } | 179 | } |
180 | } | 180 | } |
181 | 181 | ||
182 | void OTGateway::timerEvent( QTimerEvent * ) { | 182 | void OTGateway::timerEvent( QTimerEvent * ) { |
183 | 183 | ||
184 | OTDriver * D; | 184 | OTDriver * D; |
185 | unsigned int oldc = AllDrivers.count(); | 185 | unsigned int oldc = AllDrivers.count(); |
186 | bool old; | 186 | bool old; |
187 | 187 | ||
188 | AllDrivers.update(); | 188 | AllDrivers.update(); |
189 | 189 | ||
190 | if( oldc != AllDrivers.count() ) { | 190 | if( oldc != AllDrivers.count() ) { |
191 | updateDrivers(); | 191 | updateDrivers(); |
192 | } else { | 192 | } else { |
193 | for( unsigned int i = 0; | 193 | for( unsigned int i = 0; |
194 | i < AllDrivers.count(); | 194 | i < AllDrivers.count(); |
195 | i ++ ) { | 195 | i ++ ) { |
196 | D = AllDrivers[i]; | 196 | D = AllDrivers[i]; |
197 | old = D->isUp(); | 197 | old = D->isUp(); |
198 | if( D->currentState() >= 0 ) { | 198 | if( D->currentState() >= 0 ) { |
199 | if( old != D->isUp() ) { | 199 | if( old != D->isUp() ) { |
200 | emit stateChange( D, D->isUp() ); | 200 | emit stateChange( D, D->isUp() ); |
201 | } | 201 | } |
202 | } else { | 202 | } else { |
203 | // if one driver is unable to provide info | 203 | // if one driver is unable to provide info |
204 | // we refresh all devices | 204 | // we refresh all devices |
205 | updateDrivers(); | 205 | updateDrivers(); |
206 | return; | 206 | return; |
207 | } | 207 | } |
208 | } | 208 | } |
209 | } | 209 | } |
210 | } | 210 | } |
211 | 211 | ||
212 | void OTGateway::SLOT_Enabled( int id, bool Up ) { | 212 | void OTGateway::SLOT_Enabled( int id, bool Up ) { |
213 | owarn << "device " << id << " state " << Up << oendl; | 213 | odebug << "device " << id << " state " << Up << oendl; |
214 | if( Up ) { | 214 | if( Up ) { |
215 | // device is up -> detect it | 215 | // device is up -> detect it |
216 | updateDrivers(); | 216 | updateDrivers(); |
217 | if( (unsigned)id >= AllDrivers.count() ) { | 217 | if( (unsigned)id >= AllDrivers.count() ) { |
218 | // to make sure that the driver really IS detected | 218 | // to make sure that the driver really IS detected |
219 | AllDrivers[id]->bringUp(); | 219 | AllDrivers[id]->bringUp(); |
220 | } | 220 | } |
221 | } // if DOWN device already down | 221 | } // if DOWN device already down |
222 | emit deviceEnabled( Up ); | 222 | emit deviceEnabled( Up ); |
223 | } | 223 | } |
224 | 224 | ||
225 | void OTGateway::updateDrivers( void ) { | 225 | void OTGateway::updateDrivers( void ) { |
226 | OTDriver * D; | 226 | OTDriver * D; |
227 | 227 | ||
228 | AllDrivers.update(); | 228 | AllDrivers.update(); |
229 | 229 | ||
230 | owarn << "updated drivers. now " << AllDrivers.count() << oendl; | 230 | odebug << "updated drivers. now " << AllDrivers.count() << oendl; |
231 | 231 | ||
232 | // connect signals for each driver | 232 | // connect signals for each driver |
233 | for( unsigned int i = 0; | 233 | for( unsigned int i = 0; |
234 | i < AllDrivers.count(); | 234 | i < AllDrivers.count(); |
235 | i ++ ) { | 235 | i ++ ) { |
236 | D = AllDrivers[i]; | 236 | D = AllDrivers[i]; |
237 | 237 | ||
238 | connect( D, | 238 | connect( D, |
239 | SIGNAL( error( const QString & ) ), | 239 | SIGNAL( error( const QString & ) ), |
240 | this, | 240 | this, |
241 | SLOT( SLOT_ShowError( const QString & ) ) | 241 | SLOT( SLOT_ShowError( const QString & ) ) |
242 | ); | 242 | ); |
243 | 243 | ||
244 | connect( D, | 244 | connect( D, |
245 | SIGNAL( stateChange( OTDriver *, bool ) ), | 245 | SIGNAL( stateChange( OTDriver *, bool ) ), |
246 | this, | 246 | this, |
247 | SIGNAL( stateChange( OTDriver *, bool ) ) | 247 | SIGNAL( stateChange( OTDriver *, bool ) ) |
248 | ); | 248 | ); |
249 | 249 | ||
250 | connect( D, | 250 | connect( D, |
251 | SIGNAL( driverDisappeared( OTDriver * ) ), | 251 | SIGNAL( driverDisappeared( OTDriver * ) ), |
252 | this, | 252 | this, |
253 | SLOT( SLOT_DriverDisappeared( OTDriver * ) ) | 253 | SLOT( SLOT_DriverDisappeared( OTDriver * ) ) |
254 | ); | 254 | ); |
255 | } | 255 | } |
256 | 256 | ||
257 | // verify main device too | 257 | // verify main device too |
258 | if( TheOTDevice ) | 258 | if( TheOTDevice ) |
259 | TheOTDevice->checkAttach(); | 259 | TheOTDevice->checkAttach(); |
260 | 260 | ||
261 | // set to default scanning hardware | 261 | // set to default scanning hardware |
262 | setScanWith( 0 ); | 262 | setScanWith( 0 ); |
263 | 263 | ||
264 | emit driverListChanged(); | 264 | emit driverListChanged(); |
265 | } | 265 | } |
266 | 266 | ||
267 | void OTGateway::SLOT_DriverDisappeared( OTDriver * D ) { | 267 | void OTGateway::SLOT_DriverDisappeared( OTDriver * D ) { |
268 | owarn << "Driver " << D->devname() << " when offline" << oendl; | 268 | odebug << "Driver " << D->devname() << " when offline" << oendl; |
269 | updateDrivers(); | 269 | updateDrivers(); |
270 | } | 270 | } |
271 | 271 | ||
272 | void OTGateway::scanNeighbourhood( OTDriver * D ) { | 272 | void OTGateway::scanNeighbourhood( OTDriver * D ) { |
273 | 273 | ||
274 | if( Scanning ) { | 274 | if( Scanning ) { |
275 | stopScanOfNeighbourhood(); | 275 | stopScanOfNeighbourhood(); |
276 | } | 276 | } |
277 | 277 | ||
278 | if( D ) { | 278 | if( D ) { |
279 | setScanWith( D ); | 279 | setScanWith( D ); |
280 | } | 280 | } |
281 | 281 | ||
282 | Scanning = new OTInquiry( scanWith() ); | 282 | Scanning = new OTInquiry( scanWith() ); |
283 | 283 | ||
284 | connect( Scanning, | 284 | connect( Scanning, |
285 | SIGNAL( peerFound( OTPeer *, bool )), | 285 | SIGNAL( peerFound( OTPeer *, bool )), |
286 | this, | 286 | this, |
287 | SLOT( SLOT_PeerDetected( OTPeer *, bool ) ) | 287 | SLOT( SLOT_PeerDetected( OTPeer *, bool ) ) |
288 | ); | 288 | ); |
289 | connect( Scanning, | 289 | connect( Scanning, |
290 | SIGNAL( finished()), | 290 | SIGNAL( finished()), |
291 | this, | 291 | this, |
292 | SLOT( SLOT_FinishedDetecting() ) | 292 | SLOT( SLOT_FinishedDetecting() ) |
293 | ); | 293 | ); |
294 | 294 | ||
295 | // start scanning | 295 | // start scanning |
296 | Scanning->inquire( 30.0 ); | 296 | Scanning->inquire( 30.0 ); |
297 | } | 297 | } |
298 | 298 | ||
299 | OTPeer* OTGateway::findPeer( const OTDeviceAddress & Addr ) { | 299 | OTPeer* OTGateway::findPeer( const OTDeviceAddress & Addr ) { |
300 | for( unsigned int i = 0 ; i < AllPeers.count(); i ++ ) { | 300 | for( unsigned int i = 0 ; i < AllPeers.count(); i ++ ) { |
301 | if( AllPeers[i]->address() == Addr ) { | 301 | if( AllPeers[i]->address() == Addr ) { |
302 | return AllPeers[i]; | 302 | return AllPeers[i]; |
303 | } | 303 | } |
304 | } | 304 | } |
305 | return 0; | 305 | return 0; |
306 | } | 306 | } |
307 | 307 | ||
308 | OTDriver* OTGateway::findDriver( const OTDeviceAddress & Addr ) { | 308 | OTDriver* OTGateway::findDriver( const OTDeviceAddress & Addr ) { |
309 | for( unsigned int i = 0 ; i < AllDrivers.count(); i ++ ) { | 309 | for( unsigned int i = 0 ; i < AllDrivers.count(); i ++ ) { |
310 | if( AllDrivers[i]->address() == Addr ) { | 310 | if( AllDrivers[i]->address() == Addr ) { |
311 | return AllDrivers[i]; | 311 | return AllDrivers[i]; |
312 | } | 312 | } |
313 | } | 313 | } |
314 | return 0; | 314 | return 0; |
315 | } | 315 | } |
316 | 316 | ||
317 | void OTGateway::SLOT_PeerDetected( OTPeer * P, bool IsNew ) { | 317 | void OTGateway::SLOT_PeerDetected( OTPeer * P, bool IsNew ) { |
318 | 318 | ||
319 | if( IsNew ) { | 319 | if( IsNew ) { |
320 | // new peer | 320 | // new peer |
321 | owarn << "New peer " << P->name() << oendl; | 321 | odebug << "New peer " << P->name() << oendl; |
322 | addPeer( P ); | 322 | addPeer( P ); |
323 | } | 323 | } |
324 | 324 | ||
325 | emit detectedPeer( P, IsNew ); | 325 | emit detectedPeer( P, IsNew ); |
326 | } | 326 | } |
327 | 327 | ||
328 | void OTGateway::addPeer( OTPeer * P ) { | 328 | void OTGateway::addPeer( OTPeer * P ) { |
329 | AllPeers.resize( AllPeers.size()+1); | 329 | AllPeers.resize( AllPeers.size()+1); |
330 | AllPeers.insert( AllPeers.size()-1, P ); | 330 | AllPeers.insert( AllPeers.size()-1, P ); |
331 | AllPeersModified = 1; | 331 | AllPeersModified = 1; |
332 | } | 332 | } |
333 | 333 | ||
334 | void OTGateway::removePeer( OTPeer * P ) { | 334 | void OTGateway::removePeer( OTPeer * P ) { |
335 | int i = AllPeers.find( P ); | 335 | int i = AllPeers.find( P ); |
336 | if( i ) { | 336 | if( i ) { |
337 | AllPeers.remove( i ); | 337 | AllPeers.remove( i ); |
338 | AllPeersModified = 1; | 338 | AllPeersModified = 1; |
339 | } | 339 | } |
340 | } | 340 | } |
341 | 341 | ||
342 | void OTGateway::stopScanOfNeighbourhood( void ) { | 342 | void OTGateway::stopScanOfNeighbourhood( void ) { |
343 | if( Scanning ) { | 343 | if( Scanning ) { |
344 | delete Scanning; | 344 | delete Scanning; |
345 | Scanning = 0; | 345 | Scanning = 0; |
346 | } | 346 | } |
347 | } | 347 | } |
348 | 348 | ||
349 | void OTGateway::SLOT_FinishedDetecting() { | 349 | void OTGateway::SLOT_FinishedDetecting() { |
350 | stopScanOfNeighbourhood(); | 350 | stopScanOfNeighbourhood(); |
351 | emit finishedDetecting(); | 351 | emit finishedDetecting(); |
352 | } | 352 | } |
353 | 353 | ||
354 | const char * OTGateway::deviceTypeToName( int cls ) { | 354 | const char * OTGateway::deviceTypeToName( int cls ) { |
355 | switch ( (cls & 0x001F00) >> 8) { | 355 | switch ( (cls & 0x001F00) >> 8) { |
356 | case 0x00: | 356 | case 0x00: |
357 | return "misc"; | 357 | return "misc"; |
358 | case 0x01: | 358 | case 0x01: |
359 | return "computer"; | 359 | return "computer"; |
360 | case 0x02: | 360 | case 0x02: |
361 | return "phone"; | 361 | return "phone"; |
362 | case 0x03: | 362 | case 0x03: |
363 | return "lan"; | 363 | return "lan"; |
364 | case 0x04: | 364 | case 0x04: |
365 | return "av"; | 365 | return "av"; |
366 | case 0x05: | 366 | case 0x05: |
367 | return "peripheral"; | 367 | return "peripheral"; |
368 | case 0x06: | 368 | case 0x06: |
369 | return "imaging"; | 369 | return "imaging"; |
370 | case 0x07: | 370 | case 0x07: |
371 | default : | 371 | default : |
372 | break; | 372 | break; |
373 | } | 373 | } |
374 | return "unknown"; | 374 | return "unknown"; |
375 | } | 375 | } |
376 | 376 | ||
377 | PANConnectionVector OTGateway::getPANConnections( void ) { | 377 | PANConnectionVector OTGateway::getPANConnections( void ) { |
378 | PANConnectionVector V; | 378 | PANConnectionVector V; |
379 | 379 | ||
380 | struct bnep_connlist_req req; | 380 | struct bnep_connlist_req req; |
381 | struct bnep_conninfo ci[48]; | 381 | struct bnep_conninfo ci[48]; |
382 | 382 | ||
383 | V.setAutoDelete(TRUE); | 383 | V.setAutoDelete(TRUE); |
384 | 384 | ||
385 | int ctl = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_BNEP); | 385 | int ctl = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_BNEP); |
386 | if (ctl < 0) { | 386 | if (ctl < 0) { |
387 | owarn << "Failed to open control socket" << oendl; | 387 | odebug << "Failed to open control socket" << oendl; |
388 | return V; | 388 | return V; |
389 | } | 389 | } |
390 | 390 | ||
391 | req.cnum = 48; | 391 | req.cnum = 48; |
392 | req.ci = ci; | 392 | req.ci = ci; |
393 | if (ioctl(ctl, BNEPGETCONNLIST, &req)) { | 393 | if (ioctl(ctl, BNEPGETCONNLIST, &req)) { |
394 | owarn << "Failed to get connection list" << oendl; | 394 | odebug << "Failed to get connection list" << oendl; |
395 | ::close( ctl ); | 395 | ::close( ctl ); |
396 | return V; | 396 | return V; |
397 | } | 397 | } |
398 | 398 | ||
399 | for ( unsigned i=0; i < req.cnum; i++) { | 399 | for ( unsigned i=0; i < req.cnum; i++) { |
400 | V.resize( V.size() + 1 ); | 400 | V.resize( V.size() + 1 ); |
401 | if( ci[i].role == BNEP_SVC_PANU ) { | 401 | if( ci[i].role == BNEP_SVC_PANU ) { |
402 | // we are the client | 402 | // we are the client |
403 | V.insert( V.size()-1, new OTPANConnection( | 403 | V.insert( V.size()-1, new OTPANConnection( |
404 | ci[i].device, | 404 | ci[i].device, |
405 | batostr((bdaddr_t *) ci[i].dst) | 405 | batostr((bdaddr_t *) ci[i].dst) |
406 | ) ); | 406 | ) ); |
407 | } | 407 | } |
408 | } | 408 | } |
409 | 409 | ||
410 | ::close( ctl ); | 410 | ::close( ctl ); |
411 | return V; | 411 | return V; |
412 | } | 412 | } |
413 | 413 | ||
414 | struct link_key { | 414 | struct link_key { |
415 | bdaddr_t sba; | 415 | bdaddr_t sba; |
416 | bdaddr_t dba; | 416 | bdaddr_t dba; |
417 | uint8_t key[16]; | 417 | uint8_t key[16]; |
418 | uint8_t type; | 418 | uint8_t type; |
419 | time_t time; | 419 | time_t time; |
420 | }; | 420 | }; |
421 | 421 | ||
422 | void OTGateway::readLinkKeys( void ) { | 422 | void OTGateway::readLinkKeys( void ) { |
423 | 423 | ||
424 | struct link_key k; | 424 | struct link_key k; |
425 | int rv; | 425 | int rv; |
426 | 426 | ||
427 | AllKeys.truncate(0); | 427 | AllKeys.truncate(0); |
428 | 428 | ||
429 | QFile F( "/etc/bluetooth/link_key" ); | 429 | QFile F( "/etc/bluetooth/link_key" ); |
430 | 430 | ||
431 | if( ! F.open( IO_ReadOnly ) ) { | 431 | if( ! F.open( IO_ReadOnly ) ) { |
432 | emit error( tr("Cannot open link_key file") ); | 432 | emit error( tr("Cannot open link_key file") ); |
433 | return; | 433 | return; |
434 | } | 434 | } |
435 | 435 | ||
436 | while( 1 ) { | 436 | while( 1 ) { |
437 | rv = F.readBlock( (char *)&k, sizeof( k ) ); | 437 | rv = F.readBlock( (char *)&k, sizeof( k ) ); |
438 | if( rv == 0 ) | 438 | if( rv == 0 ) |
439 | // EOF | 439 | // EOF |
440 | break; | 440 | break; |
441 | 441 | ||
442 | if( rv < 0 ) { | 442 | if( rv < 0 ) { |
443 | emit error( tr("Read error in link key file") ); | 443 | emit error( tr("Read error in link key file") ); |
444 | } | 444 | } |
445 | 445 | ||
446 | AllKeys.resize( AllKeys.size()+1 ); | 446 | AllKeys.resize( AllKeys.size()+1 ); |
447 | AllKeys[ AllKeys.size()-1 ].From.setBDAddr( k.sba ); | 447 | AllKeys[ AllKeys.size()-1 ].From.setBDAddr( k.sba ); |
448 | AllKeys[ AllKeys.size()-1 ].To.setBDAddr( k.dba ); | 448 | AllKeys[ AllKeys.size()-1 ].To.setBDAddr( k.dba ); |
449 | } | 449 | } |
450 | } | 450 | } |
451 | 451 | ||
452 | bool OTGateway::removeLinkKey( unsigned int Index ) { | 452 | bool OTGateway::removeLinkKey( unsigned int Index ) { |
453 | OTLinkKey & LK = AllKeys[Index]; | 453 | OTLinkKey & LK = AllKeys[Index]; |
454 | 454 | ||
455 | struct link_key k; | 455 | struct link_key k; |
456 | int rv; | 456 | int rv; |
457 | 457 | ||
458 | QFile F( "/etc/bluetooth/link_key" ); | 458 | QFile F( "/etc/bluetooth/link_key" ); |
459 | QFile OutF( "/etc/bluetooth/newlink_key" ); | 459 | QFile OutF( "/etc/bluetooth/newlink_key" ); |
460 | 460 | ||
461 | if( ! F.open( IO_ReadOnly ) ) { | 461 | if( ! F.open( IO_ReadOnly ) ) { |
462 | emit error( tr("Cannot open link_key file") ); | 462 | emit error( tr("Cannot open link_key file") ); |
463 | return 0; | 463 | return 0; |
464 | } | 464 | } |
465 | 465 | ||
466 | if( ! OutF.open( IO_WriteOnly | IO_Truncate ) ) { | 466 | if( ! OutF.open( IO_WriteOnly | IO_Truncate ) ) { |
467 | emit error( tr("Cannot open temporary link_key file") ); | 467 | emit error( tr("Cannot open temporary link_key file") ); |
468 | return 0; | 468 | return 0; |
469 | } | 469 | } |
470 | 470 | ||
471 | while( 1 ) { | 471 | while( 1 ) { |
472 | rv = F.readBlock( (char *)&k, sizeof( k ) ); | 472 | rv = F.readBlock( (char *)&k, sizeof( k ) ); |
473 | if( rv == 0 ) | 473 | if( rv == 0 ) |
474 | // EOF | 474 | // EOF |
475 | break; | 475 | break; |
476 | 476 | ||
477 | if( rv < 0 ) { | 477 | if( rv < 0 ) { |
478 | emit error( tr("Read error in link key file") ); | 478 | emit error( tr("Read error in link key file") ); |
479 | return 0; | 479 | return 0; |
480 | } | 480 | } |
481 | 481 | ||
482 | if( LK.from() != OTDeviceAddress( k.sba ) || | 482 | if( LK.from() != OTDeviceAddress( k.sba ) || |
483 | LK.to() != OTDeviceAddress( k.dba ) ) { | 483 | LK.to() != OTDeviceAddress( k.dba ) ) { |
484 | // copy | 484 | // copy |
485 | OutF.writeBlock( (char *)&k, sizeof( k ) ); | 485 | OutF.writeBlock( (char *)&k, sizeof( k ) ); |
486 | } // else remove this key | 486 | } // else remove this key |
487 | } | 487 | } |
488 | 488 | ||
489 | // rename files | 489 | // rename files |
490 | QDir D( "/etc/bluetooth" ); | 490 | QDir D( "/etc/bluetooth" ); |
491 | 491 | ||
492 | D.remove( "link_key" ); | 492 | D.remove( "link_key" ); |
493 | D.rename( "newlink_key", "link_key" ); | 493 | D.rename( "newlink_key", "link_key" ); |
494 | 494 | ||
495 | // restart hcid | 495 | // restart hcid |
496 | system( "/etc/init.d/hcid stop" ); | 496 | system( "/etc/init.d/hcid stop" ); |
497 | system( "/etc/init.d/hcid start" ); | 497 | system( "/etc/init.d/hcid start" ); |
498 | 498 | ||
499 | // remove from table | 499 | // remove from table |
500 | if( Index < (AllKeys.size()-1) ) { | 500 | if( Index < (AllKeys.size()-1) ) { |
501 | // collapse array | 501 | // collapse array |
502 | AllKeys[Index] = AllKeys[AllKeys.size()-1]; | 502 | AllKeys[Index] = AllKeys[AllKeys.size()-1]; |
503 | } | 503 | } |
504 | 504 | ||
505 | // remove last element | 505 | // remove last element |
506 | AllKeys.resize( AllKeys.size()-1 ); | 506 | AllKeys.resize( AllKeys.size()-1 ); |
507 | 507 | ||
508 | return 1; | 508 | return 1; |
509 | } | 509 | } |
510 | 510 | ||
511 | #define MAXCONNECTIONS 10 | 511 | #define MAXCONNECTIONS 10 |
512 | void OTGateway::loadActiveConnections( void ) { | 512 | void OTGateway::loadActiveConnections( void ) { |
513 | 513 | ||
514 | struct hci_conn_list_req *cl; | 514 | struct hci_conn_list_req *cl; |
515 | struct hci_conn_info *ci; | 515 | struct hci_conn_info *ci; |
516 | OTDeviceAddress Addr; | 516 | OTDeviceAddress Addr; |
517 | OTPeer * P; | 517 | OTPeer * P; |
518 | 518 | ||
519 | if (!(cl = (struct hci_conn_list_req *)malloc( | 519 | if (!(cl = (struct hci_conn_list_req *)malloc( |
520 | MAXCONNECTIONS * sizeof(*ci) + sizeof(*cl)))) { | 520 | MAXCONNECTIONS * sizeof(*ci) + sizeof(*cl)))) { |
521 | emit error( tr("Can't allocate memory") ); | 521 | emit error( tr("Can't allocate memory") ); |
522 | return; | 522 | return; |
523 | } | 523 | } |
524 | memset( cl, 0, MAXCONNECTIONS * sizeof(*ci) + sizeof(*cl) ); | 524 | memset( cl, 0, MAXCONNECTIONS * sizeof(*ci) + sizeof(*cl) ); |
525 | 525 | ||
526 | for( unsigned int i = 0; | 526 | for( unsigned int i = 0; |
527 | i < AllDrivers.count(); | 527 | i < AllDrivers.count(); |
528 | i ++ ) { | 528 | i ++ ) { |
529 | 529 | ||
530 | if( ! AllDrivers[i]->isUp() ) { | 530 | if( ! AllDrivers[i]->isUp() ) { |
531 | continue; | 531 | continue; |
532 | } | 532 | } |
533 | 533 | ||
534 | // driver is up -> check connections | 534 | // driver is up -> check connections |
535 | cl->dev_id = AllDrivers[i]->devId(); | 535 | cl->dev_id = AllDrivers[i]->devId(); |
536 | cl->conn_num = MAXCONNECTIONS; | 536 | cl->conn_num = MAXCONNECTIONS; |
537 | ci = cl->conn_info; | 537 | ci = cl->conn_info; |
538 | 538 | ||
539 | if (ioctl( getSocket(), HCIGETCONNLIST, (void *) cl)) { | 539 | if (ioctl( getSocket(), HCIGETCONNLIST, (void *) cl)) { |
540 | emit error( tr("Can't get connection list") ); | 540 | emit error( tr("Can't get connection list") ); |
541 | break; | 541 | break; |
542 | } | 542 | } |
543 | 543 | ||
544 | for ( int k = 0; k < cl->conn_num; k++, ci++) { | 544 | for ( int k = 0; k < cl->conn_num; k++, ci++) { |
545 | 545 | ||
546 | if( ci->state != BT_CONNECTED ) { | 546 | if( ci->state != BT_CONNECTED ) { |
547 | // not yet connected | 547 | // not yet connected |
548 | continue; | 548 | continue; |
549 | } | 549 | } |
550 | 550 | ||
551 | Addr.setBDAddr( ci->bdaddr ); | 551 | Addr.setBDAddr( ci->bdaddr ); |
552 | P = findPeer( Addr ); | 552 | P = findPeer( Addr ); |
553 | if( ! P ) { | 553 | if( ! P ) { |
554 | // peer not yet known -> add | 554 | // peer not yet known -> add |
555 | P = new OTPeer( this ); | 555 | P = new OTPeer( this ); |
556 | addPeer( P ); | 556 | addPeer( P ); |
557 | P->setAddress( Addr ); | 557 | P->setAddress( Addr ); |
558 | // infoQueue.push_back(info); | 558 | // infoQueue.push_back(info); |
559 | P->setName( AllDrivers[i]->getPeerName( Addr ) ); | 559 | P->setName( AllDrivers[i]->getPeerName( Addr ) ); |
560 | } | 560 | } |
561 | P->setState( OTPeer::Peer_Up ); | 561 | P->setState( OTPeer::Peer_Up ); |
562 | P->setConnectedTo( AllDrivers[i] ); | 562 | P->setConnectedTo( AllDrivers[i] ); |
563 | } | 563 | } |
564 | } | 564 | } |
565 | 565 | ||
566 | free( cl ); | 566 | free( cl ); |
567 | } | 567 | } |
568 | 568 | ||
569 | void OTGateway::loadKnownPeers( void ) { | 569 | void OTGateway::loadKnownPeers( void ) { |
570 | QDir SaveDir = QDir::home(); | 570 | QDir SaveDir = QDir::home(); |
571 | 571 | ||
572 | if( ! SaveDir.exists( "Settings" ) ) { | 572 | if( ! SaveDir.exists( "Settings" ) ) { |
573 | return; | 573 | return; |
574 | } | 574 | } |
575 | SaveDir.cd( "Settings" ); | 575 | SaveDir.cd( "Settings" ); |
576 | 576 | ||
577 | if( ! SaveDir.exists( "opietooth" ) ) { | 577 | if( ! SaveDir.exists( "opietooth" ) ) { |
578 | return; | 578 | return; |
579 | } | 579 | } |
580 | SaveDir.cd( "opietooth" ); | 580 | SaveDir.cd( "opietooth" ); |
581 | 581 | ||
582 | QFile F( SaveDir.path() + "/SeenDevices.conf" ); | 582 | QFile F( SaveDir.path() + "/SeenDevices.conf" ); |
583 | 583 | ||
584 | if( F.open( IO_ReadOnly ) ) { | 584 | if( F.open( IO_ReadOnly ) ) { |
585 | QTextStream TS(&F); | 585 | QTextStream TS(&F); |
586 | long count; | 586 | long count; |
587 | 587 | ||
588 | count = TS.readLine().toLong(); | 588 | count = TS.readLine().toLong(); |
589 | 589 | ||
590 | while( count > 0 ) { | 590 | while( count > 0 ) { |
591 | addPeer( new OTPeer( TS, this ) ); | 591 | addPeer( new OTPeer( TS, this ) ); |
592 | count --; | 592 | count --; |
593 | } | 593 | } |
594 | } | 594 | } |
595 | 595 | ||
596 | AllPeersModified = 0; | 596 | AllPeersModified = 0; |
597 | } | 597 | } |
598 | 598 | ||
599 | void OTGateway::saveKnownPeers( void ) { | 599 | void OTGateway::saveKnownPeers( void ) { |
600 | QDir SaveDir = QDir::home(); | 600 | QDir SaveDir = QDir::home(); |
601 | 601 | ||
602 | if( ! SaveDir.exists( "Settings" ) ) { | 602 | if( ! SaveDir.exists( "Settings" ) ) { |
603 | SaveDir.mkdir( "Settings" ); | 603 | SaveDir.mkdir( "Settings" ); |
604 | } | 604 | } |
605 | SaveDir.cd( "Settings" ); | 605 | SaveDir.cd( "Settings" ); |
606 | 606 | ||
607 | if( ! SaveDir.exists( "opietooth" ) ) { | 607 | if( ! SaveDir.exists( "opietooth" ) ) { |
608 | SaveDir.mkdir( "opietooth" ); | 608 | SaveDir.mkdir( "opietooth" ); |
609 | } | 609 | } |
610 | SaveDir.cd( "opietooth" ); | 610 | SaveDir.cd( "opietooth" ); |
611 | 611 | ||
612 | QFile F( SaveDir.path() + "/SeenDevices.conf" ); | 612 | QFile F( SaveDir.path() + "/SeenDevices.conf" ); |
613 | 613 | ||
614 | if( F.open( IO_WriteOnly | IO_Truncate ) ) { | 614 | if( F.open( IO_WriteOnly | IO_Truncate ) ) { |
615 | QTextStream TS(&F); | 615 | QTextStream TS(&F); |
616 | QString S; | 616 | QString S; |
617 | 617 | ||
618 | TS << AllPeers.count() << endl; | 618 | TS << AllPeers.count() << endl; |
619 | 619 | ||
620 | for( unsigned int i = 0; | 620 | for( unsigned int i = 0; |
621 | i < AllPeers.count(); | 621 | i < AllPeers.count(); |
622 | i ++ ) { | 622 | i ++ ) { |
623 | AllPeers[i]->save( TS ); | 623 | AllPeers[i]->save( TS ); |
624 | } | 624 | } |
625 | AllPeersModified = 0; | 625 | AllPeersModified = 0; |
626 | } | 626 | } |
627 | AllPeersModified = 0; | 627 | AllPeersModified = 0; |
628 | } | 628 | } |
629 | 629 | ||
630 | int OTGateway::connectedToRFCommChannel( const OTDeviceAddress & Addr, | 630 | int OTGateway::connectedToRFCommChannel( const OTDeviceAddress & Addr, |
631 | int channel ) { | 631 | int channel ) { |
632 | 632 | ||
633 | int s; | 633 | int s; |
634 | 634 | ||
635 | if( (s = ::socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_RFCOMM)) < 0 ) { | 635 | if( (s = ::socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_RFCOMM)) < 0 ) { |
636 | emit error( tr("Can't open RFCOMM control socket") ); | 636 | emit error( tr("Can't open RFCOMM control socket") ); |
637 | return 0; | 637 | return 0; |
638 | } | 638 | } |
639 | 639 | ||
640 | // get all rfcomm devices | 640 | // get all rfcomm devices |
641 | { struct rfcomm_dev_list_req *dl; | 641 | { struct rfcomm_dev_list_req *dl; |
642 | struct rfcomm_dev_info *di, *dr; | 642 | struct rfcomm_dev_info *di, *dr; |
643 | int i; | 643 | int i; |
644 | 644 | ||
645 | dl = (struct rfcomm_dev_list_req *)alloca( | 645 | dl = (struct rfcomm_dev_list_req *)alloca( |
646 | sizeof(*dl) + RFCOMM_MAX_DEV * sizeof(*di)); | 646 | sizeof(*dl) + RFCOMM_MAX_DEV * sizeof(*di)); |
647 | memset( dl, 0, sizeof(*dl) + RFCOMM_MAX_DEV * sizeof(*di) ); | 647 | memset( dl, 0, sizeof(*dl) + RFCOMM_MAX_DEV * sizeof(*di) ); |
648 | dl->dev_num = RFCOMM_MAX_DEV; | 648 | dl->dev_num = RFCOMM_MAX_DEV; |
649 | di = dl->dev_info; | 649 | di = dl->dev_info; |
650 | 650 | ||
651 | if( ::ioctl(s, RFCOMMGETDEVLIST, (void *) dl) < 0) { | 651 | if( ::ioctl(s, RFCOMMGETDEVLIST, (void *) dl) < 0) { |
652 | emit error( tr("Can't get device list") ); | 652 | emit error( tr("Can't get device list") ); |
653 | ::close( s ); | 653 | ::close( s ); |
654 | return 0; | 654 | return 0; |
655 | } | 655 | } |
656 | 656 | ||
657 | dr = di; | 657 | dr = di; |
658 | for (i = 0; i < dl->dev_num; i++, dr++) { | 658 | for (i = 0; i < dl->dev_num; i++, dr++) { |
659 | // connected to Peer | 659 | // connected to Peer |
660 | if( Addr == OTDeviceAddress( dr->dst ) && | 660 | if( Addr == OTDeviceAddress( dr->dst ) && |
661 | channel == dr->channel && | 661 | channel == dr->channel && |
662 | ( dr->state != 0 ) | 662 | ( dr->state != 0 ) |
663 | ) { | 663 | ) { |
664 | // return device ID | 664 | // return device ID |
665 | return dr->id; | 665 | return dr->id; |
666 | } | 666 | } |
667 | } | 667 | } |
668 | } | 668 | } |
669 | 669 | ||
670 | // no device | 670 | // no device |
671 | return -1; | 671 | return -1; |
672 | } | 672 | } |
673 | 673 | ||
674 | static int byID( struct rfcomm_dev_info * d1, | 674 | static int byID( struct rfcomm_dev_info * d1, |
675 | struct rfcomm_dev_info * d2 ) { | 675 | struct rfcomm_dev_info * d2 ) { |
676 | return d1->id - d2->id; | 676 | return d1->id - d2->id; |
677 | } | 677 | } |
678 | 678 | ||
679 | int OTGateway::getFreeRFCommDevice( void ) { | 679 | int OTGateway::getFreeRFCommDevice( void ) { |
680 | 680 | ||
681 | int s; | 681 | int s; |
682 | 682 | ||
683 | if( (s = ::socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_RFCOMM)) < 0 ) { | 683 | if( (s = ::socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_RFCOMM)) < 0 ) { |
684 | emit error( tr("Can't open RFCOMM control socket") ); | 684 | emit error( tr("Can't open RFCOMM control socket") ); |
685 | return 0; | 685 | return 0; |
686 | } | 686 | } |
687 | 687 | ||
688 | // get all rfcomm devices | 688 | // get all rfcomm devices |
689 | { struct rfcomm_dev_list_req *dl; | 689 | { struct rfcomm_dev_list_req *dl; |
690 | struct rfcomm_dev_info *di, *dr; | 690 | struct rfcomm_dev_info *di, *dr; |
691 | int i; | 691 | int i; |
692 | 692 | ||
693 | dl = (struct rfcomm_dev_list_req *)alloca( | 693 | dl = (struct rfcomm_dev_list_req *)alloca( |
694 | sizeof(*dl) + RFCOMM_MAX_DEV * sizeof(*di)); | 694 | sizeof(*dl) + RFCOMM_MAX_DEV * sizeof(*di)); |
695 | 695 | ||
696 | dl->dev_num = RFCOMM_MAX_DEV; | 696 | dl->dev_num = RFCOMM_MAX_DEV; |
697 | di = dl->dev_info; | 697 | di = dl->dev_info; |
698 | 698 | ||
699 | if( ::ioctl(s, RFCOMMGETDEVLIST, (void *) dl) < 0) { | 699 | if( ::ioctl(s, RFCOMMGETDEVLIST, (void *) dl) < 0) { |
700 | emit error( tr("Can't get device list") ); | 700 | emit error( tr("Can't get device list") ); |
701 | ::close( s ); | 701 | ::close( s ); |
702 | return 0; | 702 | return 0; |
703 | } | 703 | } |
704 | 704 | ||
705 | // s | 705 | // s |
706 | if( dl->dev_num ) { | 706 | if( dl->dev_num ) { |
707 | qsort( di, sizeof(struct rfcomm_dev_info), | 707 | qsort( di, sizeof(struct rfcomm_dev_info), |
708 | dl->dev_num, (int(*)(const void*,const void*))byID ); | 708 | dl->dev_num, (int(*)(const void*,const void*))byID ); |
709 | int id = 0; | 709 | int id = 0; |
710 | 710 | ||
711 | dr = di; | 711 | dr = di; |
712 | // find lowest free device number | 712 | // find lowest free device number |
713 | for (i = 0; i < dl->dev_num; i++, dr++) { | 713 | for (i = 0; i < dl->dev_num; i++, dr++) { |
714 | if( id != dr->id ) { | 714 | if( id != dr->id ) { |
715 | return id; | 715 | return id; |
716 | } | 716 | } |
717 | id ++; | 717 | id ++; |
718 | } | 718 | } |
719 | return id; | 719 | return id; |
720 | } else { | 720 | } else { |
721 | return 0; | 721 | return 0; |
722 | } | 722 | } |
723 | } | 723 | } |
724 | } | 724 | } |
725 | 725 | ||
726 | int OTGateway::releaseRFCommDevice( int devnr ) { | 726 | int OTGateway::releaseRFCommDevice( int devnr ) { |
727 | 727 | ||
728 | int s; | 728 | int s; |
729 | 729 | ||
730 | if( (s = ::socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_RFCOMM)) < 0 ) { | 730 | if( (s = ::socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_RFCOMM)) < 0 ) { |
731 | emit error( tr("Can't open RFCOMM control socket") ); | 731 | emit error( tr("Can't open RFCOMM control socket") ); |
732 | return 0; | 732 | return 0; |
733 | } | 733 | } |
734 | 734 | ||
735 | // get all rfcomm devices | 735 | // get all rfcomm devices |
736 | { struct rfcomm_dev_list_req *dl; | 736 | { struct rfcomm_dev_list_req *dl; |
737 | struct rfcomm_dev_info *di, *dr; | 737 | struct rfcomm_dev_info *di, *dr; |
738 | int i; | 738 | int i; |
739 | 739 | ||
740 | dl = (struct rfcomm_dev_list_req *)alloca( | 740 | dl = (struct rfcomm_dev_list_req *)alloca( |
741 | sizeof(*dl) + RFCOMM_MAX_DEV * sizeof(*di)); | 741 | sizeof(*dl) + RFCOMM_MAX_DEV * sizeof(*di)); |
742 | memset( dl, 0, sizeof(*dl) + RFCOMM_MAX_DEV * sizeof(*di) ); | 742 | memset( dl, 0, sizeof(*dl) + RFCOMM_MAX_DEV * sizeof(*di) ); |
743 | dl->dev_num = RFCOMM_MAX_DEV; | 743 | dl->dev_num = RFCOMM_MAX_DEV; |
744 | di = dl->dev_info; | 744 | di = dl->dev_info; |
745 | 745 | ||
746 | if( ::ioctl(s, RFCOMMGETDEVLIST, (void *) dl) < 0) { | 746 | if( ::ioctl(s, RFCOMMGETDEVLIST, (void *) dl) < 0) { |
747 | emit error( tr("Can't get device list") ); | 747 | emit error( tr("Can't get device list") ); |
748 | ::close( s ); | 748 | ::close( s ); |
749 | return 0; | 749 | return 0; |
750 | } | 750 | } |
751 | 751 | ||
752 | dr = di; | 752 | dr = di; |
753 | for (i = 0; i < dl->dev_num; i++, dr++) { | 753 | for (i = 0; i < dl->dev_num; i++, dr++) { |
754 | if( dr->id == devnr ) { | 754 | if( dr->id == devnr ) { |
755 | // still in connection list | 755 | // still in connection list |
756 | struct rfcomm_dev_req req; | 756 | struct rfcomm_dev_req req; |
757 | int err; | 757 | int err; |
758 | 758 | ||
759 | memset(&req, 0, sizeof(req)); | 759 | memset(&req, 0, sizeof(req)); |
760 | req.dev_id = devnr; | 760 | req.dev_id = devnr; |
761 | 761 | ||
762 | if ((err = ioctl(s, RFCOMMRELEASEDEV, &req)) < 0 ) { | 762 | if ((err = ioctl(s, RFCOMMRELEASEDEV, &req)) < 0 ) { |
763 | return err; | 763 | return err; |
764 | } | 764 | } |
765 | return 0; | 765 | return 0; |
766 | } | 766 | } |
767 | } | 767 | } |
768 | } | 768 | } |
769 | 769 | ||
770 | // no device -> nothing to release eiterh | 770 | // no device -> nothing to release eiterh |
771 | return 0; | 771 | return 0; |
772 | } | 772 | } |
773 | 773 | ||
diff --git a/noncore/settings/networksettings2/opietooth2/OTHCISocket.cpp b/noncore/settings/networksettings2/opietooth2/OTHCISocket.cpp index 471c3bf..1997b44 100644 --- a/noncore/settings/networksettings2/opietooth2/OTHCISocket.cpp +++ b/noncore/settings/networksettings2/opietooth2/OTHCISocket.cpp | |||
@@ -1,274 +1,274 @@ | |||
1 | //-*-c++-*- | 1 | //-*-c++-*- |
2 | /*************************************************************************** | 2 | /*************************************************************************** |
3 | * Copyright (C) 2003 by Fred Schaettgen * | 3 | * Copyright (C) 2003 by Fred Schaettgen * |
4 | * kdebluetooth@schaettgen.de * | 4 | * kdebluetooth@schaettgen.de * |
5 | * * | 5 | * * |
6 | * This program is free software; you can redistribute it and/or modify * | 6 | * This program is free software; you can redistribute it and/or modify * |
7 | * it under the terms of the GNU General Public License as published by * | 7 | * it under the terms of the GNU General Public License as published by * |
8 | * the Free Software Foundation; either version 2 of the License, or * | 8 | * the Free Software Foundation; either version 2 of the License, or * |
9 | * (at your option) any later version. * | 9 | * (at your option) any later version. * |
10 | ***************************************************************************/ | 10 | ***************************************************************************/ |
11 | 11 | ||
12 | #include <qbuffer.h> | 12 | #include <qbuffer.h> |
13 | #include <qtimer.h> | 13 | #include <qtimer.h> |
14 | #include <qdatastream.h> | 14 | #include <qdatastream.h> |
15 | #include <opie2/odebug.h> | 15 | #include <opie2/odebug.h> |
16 | 16 | ||
17 | #include <bluezlib.h> | 17 | #include <bluezlib.h> |
18 | 18 | ||
19 | // #include "deviceaddress.h" | 19 | // #include "deviceaddress.h" |
20 | #include <OTHCISocket.h> | 20 | #include <OTHCISocket.h> |
21 | #include <OTDriver.h> | 21 | #include <OTDriver.h> |
22 | 22 | ||
23 | using namespace Opietooth2; | 23 | using namespace Opietooth2; |
24 | 24 | ||
25 | OTHCISocket::OTHCISocket( OTDriver * D ) : | 25 | OTHCISocket::OTHCISocket( OTDriver * D ) : |
26 | QObject( D, D->devname() ) { | 26 | QObject( D, D->devname() ) { |
27 | BStatusSet = false; | 27 | BStatusSet = false; |
28 | Driver = D; | 28 | Driver = D; |
29 | HCIReadNotifier = 0; | 29 | HCIReadNotifier = 0; |
30 | } | 30 | } |
31 | 31 | ||
32 | OTHCISocket::~OTHCISocket() { | 32 | OTHCISocket::~OTHCISocket() { |
33 | close(); | 33 | close(); |
34 | } | 34 | } |
35 | 35 | ||
36 | void OTHCISocket::close() { | 36 | void OTHCISocket::close() { |
37 | owarn << "OTHCISocket::close()" << oendl; | 37 | odebug << "OTHCISocket::close()" << oendl; |
38 | if( HCIReadNotifier ) { | 38 | if( HCIReadNotifier ) { |
39 | delete HCIReadNotifier; | 39 | delete HCIReadNotifier; |
40 | } | 40 | } |
41 | 41 | ||
42 | if( HCISocket.isValid() ) { | 42 | if( HCISocket.isValid() ) { |
43 | HCISocket.close(); | 43 | HCISocket.close(); |
44 | } | 44 | } |
45 | } | 45 | } |
46 | 46 | ||
47 | bool OTHCISocket::open() { | 47 | bool OTHCISocket::open() { |
48 | 48 | ||
49 | owarn << "OTHCISocket::open()" << oendl; | 49 | odebug << "OTHCISocket::open()" << oendl; |
50 | int s; | 50 | int s; |
51 | 51 | ||
52 | s = ::socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); | 52 | s = ::socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); |
53 | 53 | ||
54 | if (s < 0) { | 54 | if (s < 0) { |
55 | emit error( tr( "Error creating socket on %1 : %2 %3"). | 55 | emit error( tr( "Error creating socket on %1 : %2 %3"). |
56 | arg( Driver->devname() ). | 56 | arg( Driver->devname() ). |
57 | arg( errno ). | 57 | arg( errno ). |
58 | arg( strerror(errno) ) | 58 | arg( strerror(errno) ) |
59 | ); | 59 | ); |
60 | return false; | 60 | return false; |
61 | } | 61 | } |
62 | 62 | ||
63 | /* Bind socket to the HCI device */ | 63 | /* Bind socket to the HCI device */ |
64 | struct sockaddr_hci sa; | 64 | struct sockaddr_hci sa; |
65 | sa.hci_family = AF_BLUETOOTH; | 65 | sa.hci_family = AF_BLUETOOTH; |
66 | sa.hci_dev = Driver->devId(); | 66 | sa.hci_dev = Driver->devId(); |
67 | if (bind(s, (struct sockaddr *)&sa, sizeof(sa)) < 0) { | 67 | if (bind(s, (struct sockaddr *)&sa, sizeof(sa)) < 0) { |
68 | ::close(s); | 68 | ::close(s); |
69 | emit error( tr( "Error binding to socket to %1 : %2 %3"). | 69 | emit error( tr( "Error binding to socket to %1 : %2 %3"). |
70 | arg( Driver->devname() ). | 70 | arg( Driver->devname() ). |
71 | arg( errno ). | 71 | arg( errno ). |
72 | arg( strerror(errno) ) | 72 | arg( strerror(errno) ) |
73 | ); | 73 | ); |
74 | return false; | 74 | return false; |
75 | } | 75 | } |
76 | 76 | ||
77 | struct hci_filter flt; | 77 | struct hci_filter flt; |
78 | hci_filter_clear(&flt); | 78 | hci_filter_clear(&flt); |
79 | hci_filter_set_ptype(HCI_EVENT_PKT, &flt); | 79 | hci_filter_set_ptype(HCI_EVENT_PKT, &flt); |
80 | hci_filter_all_events(&flt); | 80 | hci_filter_all_events(&flt); |
81 | if( setsockopt(s, SOL_HCI, HCI_FILTER, &flt, sizeof(flt)) < 0 ) { | 81 | if( setsockopt(s, SOL_HCI, HCI_FILTER, &flt, sizeof(flt)) < 0 ) { |
82 | ::close(s); | 82 | ::close(s); |
83 | emit error( tr( "HCI filter setup failed on %1 : %2 %3"). | 83 | emit error( tr( "HCI filter setup failed on %1 : %2 %3"). |
84 | arg( Driver->devname() ). | 84 | arg( Driver->devname() ). |
85 | arg( errno ). | 85 | arg( errno ). |
86 | arg( strerror(errno) ) | 86 | arg( strerror(errno) ) |
87 | ); | 87 | ); |
88 | return false; | 88 | return false; |
89 | } | 89 | } |
90 | 90 | ||
91 | if( HCIReadNotifier ) { | 91 | if( HCIReadNotifier ) { |
92 | delete HCIReadNotifier; | 92 | delete HCIReadNotifier; |
93 | } | 93 | } |
94 | 94 | ||
95 | HCISocket.setSocket(s, QSocketDevice::Datagram); | 95 | HCISocket.setSocket(s, QSocketDevice::Datagram); |
96 | HCIReadNotifier = new QSocketNotifier( | 96 | HCIReadNotifier = new QSocketNotifier( |
97 | s, QSocketNotifier::Read, this); | 97 | s, QSocketNotifier::Read, this); |
98 | 98 | ||
99 | connect( HCIReadNotifier, | 99 | connect( HCIReadNotifier, |
100 | SIGNAL(activated(int)), | 100 | SIGNAL(activated(int)), |
101 | this, | 101 | this, |
102 | SLOT(slotSocketActivated()) | 102 | SLOT(slotSocketActivated()) |
103 | ); | 103 | ); |
104 | 104 | ||
105 | //connect(hciSocket, SIGNAL(error(int)), | 105 | //connect(hciSocket, SIGNAL(error(int)), |
106 | // this, SLOT(slotSocketError(int))); | 106 | // this, SLOT(slotSocketError(int))); |
107 | //connect(hciSocket, SIGNAL(connectionClosed()), | 107 | //connect(hciSocket, SIGNAL(connectionClosed()), |
108 | // this, SLOT(slotConnectionClosed())); | 108 | // this, SLOT(slotConnectionClosed())); |
109 | //hciSocket->setSocket(s); | 109 | //hciSocket->setSocket(s); |
110 | 110 | ||
111 | return true; | 111 | return true; |
112 | } | 112 | } |
113 | 113 | ||
114 | void OTHCISocket::slotSocketError(int e) { | 114 | void OTHCISocket::slotSocketError(int e) { |
115 | close(); | 115 | close(); |
116 | emit error( tr( "HCI socket error 0x%1 on %1 : %2 %3"). | 116 | emit error( tr( "HCI socket error 0x%1 on %1 : %2 %3"). |
117 | arg(e,2,16). | 117 | arg(e,2,16). |
118 | arg( Driver->devname() ). | 118 | arg( Driver->devname() ). |
119 | arg( errno ). | 119 | arg( errno ). |
120 | arg( strerror(errno) ) | 120 | arg( strerror(errno) ) |
121 | ); | 121 | ); |
122 | } | 122 | } |
123 | 123 | ||
124 | void OTHCISocket::slotSocketActivated() { | 124 | void OTHCISocket::slotSocketActivated() { |
125 | 125 | ||
126 | QSocketDevice::Error err = HCISocket.error(); | 126 | QSocketDevice::Error err = HCISocket.error(); |
127 | 127 | ||
128 | if( (err == QSocketDevice::NoError ) && | 128 | if( (err == QSocketDevice::NoError ) && |
129 | ( HCISocket.isValid() ) ) { | 129 | ( HCISocket.isValid() ) ) { |
130 | //kdDebug() << "HCI socket ready read." << endl; | 130 | //kdDebug() << "HCI socket ready read." << endl; |
131 | 131 | ||
132 | unsigned char buf[512]; | 132 | unsigned char buf[512]; |
133 | int psize = HCISocket.readBlock((char*)buf, 512); | 133 | int psize = HCISocket.readBlock((char*)buf, 512); |
134 | 134 | ||
135 | if (psize <= 0) { | 135 | if (psize <= 0) { |
136 | slotSocketError(HCISocket.error()); | 136 | slotSocketError(HCISocket.error()); |
137 | HCISocket.close(); | 137 | HCISocket.close(); |
138 | return; | 138 | return; |
139 | } | 139 | } |
140 | 140 | ||
141 | //unsigned char packetType = buf[0]; | 141 | //unsigned char packetType = buf[0]; |
142 | unsigned char eventCode = buf[1]; | 142 | unsigned char eventCode = buf[1]; |
143 | unsigned char len = buf[2]; | 143 | unsigned char len = buf[2]; |
144 | 144 | ||
145 | if (psize-3 == len) { | 145 | if (psize-3 == len) { |
146 | 146 | ||
147 | QByteArray databuf; | 147 | QByteArray databuf; |
148 | databuf.duplicate((char*)(buf+3), len); | 148 | databuf.duplicate((char*)(buf+3), len); |
149 | emit event(eventCode, databuf); | 149 | emit event(eventCode, databuf); |
150 | if (eventCode == EVT_CMD_STATUS) { | 150 | if (eventCode == EVT_CMD_STATUS) { |
151 | updateStatus( databuf ); | 151 | updateStatus( databuf ); |
152 | } | 152 | } |
153 | } else { | 153 | } else { |
154 | owarn << "Error reading hci packet: packetSize(" | 154 | odebug << "Error reading hci packet: packetSize(" |
155 | << psize | 155 | << psize |
156 | << ")-3 != dataSize(" | 156 | << ")-3 != dataSize(" |
157 | << len | 157 | << len |
158 | << ")" | 158 | << ")" |
159 | << oendl; | 159 | << oendl; |
160 | } | 160 | } |
161 | } else if (err == QSocketDevice::NoError) { | 161 | } else if (err == QSocketDevice::NoError) { |
162 | slotConnectionClosed(); | 162 | slotConnectionClosed(); |
163 | } else { | 163 | } else { |
164 | HCISocket.close(); | 164 | HCISocket.close(); |
165 | slotSocketError(err); | 165 | slotSocketError(err); |
166 | } | 166 | } |
167 | } | 167 | } |
168 | 168 | ||
169 | void OTHCISocket::updateStatus(const QByteArray& data) { | 169 | void OTHCISocket::updateStatus(const QByteArray& data) { |
170 | 170 | ||
171 | QDataStream stream(data, IO_ReadOnly); | 171 | QDataStream stream(data, IO_ReadOnly); |
172 | stream.setByteOrder(QDataStream::LittleEndian); | 172 | stream.setByteOrder(QDataStream::LittleEndian); |
173 | Q_UINT8 status, dummy; | 173 | Q_UINT8 status, dummy; |
174 | Q_UINT16 opcode; | 174 | Q_UINT16 opcode; |
175 | 175 | ||
176 | BStatusSet = true; | 176 | BStatusSet = true; |
177 | 177 | ||
178 | stream >> status >> dummy >> opcode; | 178 | stream >> status >> dummy >> opcode; |
179 | //kdDebug() << "updatestatus opcode=" << uint32_t(opcode) << endl; | 179 | //kdDebug() << "updatestatus opcode=" << uint32_t(opcode) << endl; |
180 | LastStatus = status; | 180 | LastStatus = status; |
181 | LastStatusOgf = cmd_opcode_ogf(opcode); | 181 | LastStatusOgf = cmd_opcode_ogf(opcode); |
182 | LastStatusOcf = cmd_opcode_ocf(opcode); | 182 | LastStatusOcf = cmd_opcode_ocf(opcode); |
183 | } | 183 | } |
184 | 184 | ||
185 | void OTHCISocket::slotConnectionClosed() { | 185 | void OTHCISocket::slotConnectionClosed() { |
186 | owarn << "HCI connection closed." << oendl; | 186 | odebug << "HCI connection closed." << oendl; |
187 | emit connectionClosed(); | 187 | emit connectionClosed(); |
188 | } | 188 | } |
189 | 189 | ||
190 | void OTHCISocket::readEvent() { | 190 | void OTHCISocket::readEvent() { |
191 | 191 | ||
192 | if (HCIReadNotifier) { | 192 | if (HCIReadNotifier) { |
193 | slotSocketActivated(); | 193 | slotSocketActivated(); |
194 | } | 194 | } |
195 | } | 195 | } |
196 | 196 | ||
197 | bool OTHCISocket::sendCommand( unsigned char ogf, | 197 | bool OTHCISocket::sendCommand( unsigned char ogf, |
198 | unsigned short ocf, | 198 | unsigned short ocf, |
199 | QByteArray buf | 199 | QByteArray buf |
200 | ) { | 200 | ) { |
201 | QBuffer packet; | 201 | QBuffer packet; |
202 | QDataStream stream(&packet); | 202 | QDataStream stream(&packet); |
203 | 203 | ||
204 | stream.setByteOrder(QDataStream::LittleEndian); | 204 | stream.setByteOrder(QDataStream::LittleEndian); |
205 | packet.open(IO_WriteOnly); | 205 | packet.open(IO_WriteOnly); |
206 | 206 | ||
207 | if (buf.size() > 255) return false; | 207 | if (buf.size() > 255) return false; |
208 | 208 | ||
209 | //kdDebug() << "sendCommand. ogf=" << ogf << " ocf=" << ocf << endl; | 209 | //kdDebug() << "sendCommand. ogf=" << ogf << " ocf=" << ocf << endl; |
210 | Q_UINT16 opcode = cmd_opcode_pack(ogf, ocf); | 210 | Q_UINT16 opcode = cmd_opcode_pack(ogf, ocf); |
211 | Q_UINT8 pType = HCI_COMMAND_PKT; | 211 | Q_UINT8 pType = HCI_COMMAND_PKT; |
212 | Q_UINT8 buflen = buf.size(); | 212 | Q_UINT8 buflen = buf.size(); |
213 | 213 | ||
214 | stream << pType << opcode << buflen; | 214 | stream << pType << opcode << buflen; |
215 | stream.writeRawBytes(buf.data(), buflen); | 215 | stream.writeRawBytes(buf.data(), buflen); |
216 | packet.close(); | 216 | packet.close(); |
217 | HCISocket.writeBlock((const char*)packet.buffer(), | 217 | HCISocket.writeBlock((const char*)packet.buffer(), |
218 | packet.buffer().size()); | 218 | packet.buffer().size()); |
219 | return true; | 219 | return true; |
220 | } | 220 | } |
221 | 221 | ||
222 | bool OTHCISocket::readStatus( unsigned char ogf, | 222 | bool OTHCISocket::readStatus( unsigned char ogf, |
223 | unsigned short ocf, | 223 | unsigned short ocf, |
224 | int *status, | 224 | int *status, |
225 | int timeout_ms) { | 225 | int timeout_ms) { |
226 | QTimer timer; | 226 | QTimer timer; |
227 | 227 | ||
228 | timer.start(timeout_ms, true); | 228 | timer.start(timeout_ms, true); |
229 | BStatusSet = false; | 229 | BStatusSet = false; |
230 | 230 | ||
231 | while (timer.isActive() && HCISocket.isValid()) { | 231 | while (timer.isActive() && HCISocket.isValid()) { |
232 | 232 | ||
233 | owarn << "OTHCISocket::readStatus()" << oendl; | 233 | odebug << "OTHCISocket::readStatus()" << oendl; |
234 | bool timeout = false; | 234 | bool timeout = false; |
235 | 235 | ||
236 | if( HCISocket.bytesAvailable() == 0) { | 236 | if( HCISocket.bytesAvailable() == 0) { |
237 | int rv = HCISocket.waitForMore(timeout_ms); | 237 | int rv = HCISocket.waitForMore(timeout_ms); |
238 | timeout = (rv == 0); | 238 | timeout = (rv == 0); |
239 | } | 239 | } |
240 | 240 | ||
241 | if (!timeout) { | 241 | if (!timeout) { |
242 | slotSocketActivated(); | 242 | slotSocketActivated(); |
243 | } | 243 | } |
244 | 244 | ||
245 | if( BStatusSet == true && | 245 | if( BStatusSet == true && |
246 | ogf == LastStatusOgf && | 246 | ogf == LastStatusOgf && |
247 | ocf == LastStatusOcf) { | 247 | ocf == LastStatusOcf) { |
248 | *status = LastStatus; | 248 | *status = LastStatus; |
249 | owarn << "OTHCISocket::readStatus(ogf=" | 249 | odebug << "OTHCISocket::readStatus(ogf=" |
250 | << ogf | 250 | << ogf |
251 | << ",ocf=" | 251 | << ",ocf=" |
252 | << ocf | 252 | << ocf |
253 | << ",timeout=" | 253 | << ",timeout=" |
254 | << LastStatus | 254 | << LastStatus |
255 | << ")" | 255 | << ")" |
256 | << oendl; | 256 | << oendl; |
257 | return true; | 257 | return true; |
258 | } | 258 | } |
259 | } | 259 | } |
260 | 260 | ||
261 | owarn << "OTHCISocket::readStatus(ogf=" | 261 | odebug << "OTHCISocket::readStatus(ogf=" |
262 | << ogf | 262 | << ogf |
263 | << ",ocf=" | 263 | << ",ocf=" |
264 | << ocf | 264 | << ocf |
265 | << ",timeout=" | 265 | << ",timeout=" |
266 | << LastStatus | 266 | << LastStatus |
267 | << ") : timeout " | 267 | << ") : timeout " |
268 | << oendl; | 268 | << oendl; |
269 | return false; | 269 | return false; |
270 | } | 270 | } |
271 | 271 | ||
272 | int OTHCISocket::socket() { | 272 | int OTHCISocket::socket() { |
273 | return HCISocket.socket(); | 273 | return HCISocket.socket(); |
274 | } | 274 | } |
diff --git a/noncore/settings/networksettings2/opietooth2/OTInquiry.cpp b/noncore/settings/networksettings2/opietooth2/OTInquiry.cpp index 8e94bbc..2bc63c7 100644 --- a/noncore/settings/networksettings2/opietooth2/OTInquiry.cpp +++ b/noncore/settings/networksettings2/opietooth2/OTInquiry.cpp | |||
@@ -1,219 +1,219 @@ | |||
1 | //-*-c++-*- | 1 | //-*-c++-*- |
2 | /*************************************************************************** | 2 | /*************************************************************************** |
3 | * Copyright (C) 2003 by Fred Schaettgen * | 3 | * Copyright (C) 2003 by Fred Schaettgen * |
4 | * kdebluetooth@schaettgen.de * | 4 | * kdebluetooth@schaettgen.de * |
5 | * * | 5 | * * |
6 | * This program is free software; you can redistribute it and/or modify * | 6 | * This program is free software; you can redistribute it and/or modify * |
7 | * it under the terms of the GNU General Public License as published by * | 7 | * it under the terms of the GNU General Public License as published by * |
8 | * the Free Software Foundation; either version 2 of the License, or * | 8 | * the Free Software Foundation; either version 2 of the License, or * |
9 | * (at your option) any later version. * | 9 | * (at your option) any later version. * |
10 | ***************************************************************************/ | 10 | ***************************************************************************/ |
11 | 11 | ||
12 | 12 | ||
13 | #include <qcstring.h> | 13 | #include <qcstring.h> |
14 | #include <qsocket.h> | 14 | #include <qsocket.h> |
15 | #include <qdatetime.h> | 15 | #include <qdatetime.h> |
16 | #include <qtimer.h> | 16 | #include <qtimer.h> |
17 | #include <qthread.h> | 17 | #include <qthread.h> |
18 | #include <qapplication.h> | 18 | #include <qapplication.h> |
19 | 19 | ||
20 | #include <bluezlib.h> | 20 | #include <bluezlib.h> |
21 | 21 | ||
22 | #include <OTGateway.h> | 22 | #include <OTGateway.h> |
23 | #include <OTDriver.h> | 23 | #include <OTDriver.h> |
24 | #include <OTPeer.h> | 24 | #include <OTPeer.h> |
25 | #include <OTHCISocket.h> | 25 | #include <OTHCISocket.h> |
26 | #include <OTInquiry.h> | 26 | #include <OTInquiry.h> |
27 | 27 | ||
28 | #include <opie2/odebug.h> | 28 | #include <opie2/odebug.h> |
29 | 29 | ||
30 | using namespace Opietooth2; | 30 | using namespace Opietooth2; |
31 | 31 | ||
32 | #define max(a,b) (((a)>(b)) ? (a) : (b)) | 32 | #define max(a,b) (((a)>(b)) ? (a) : (b)) |
33 | #define min(a,b) (((a)>(b)) ? (b) : (a)) | 33 | #define min(a,b) (((a)>(b)) ? (b) : (a)) |
34 | 34 | ||
35 | OTInquiry::OTInquiry( OTDriver * Drv ) : QObject( Drv ) { | 35 | OTInquiry::OTInquiry( OTDriver * Drv ) : QObject( Drv ) { |
36 | 36 | ||
37 | reset(); | 37 | reset(); |
38 | 38 | ||
39 | InquiryTimeoutTimer = new QTimer(this); | 39 | InquiryTimeoutTimer = new QTimer(this); |
40 | 40 | ||
41 | connect( InquiryTimeoutTimer, | 41 | connect( InquiryTimeoutTimer, |
42 | SIGNAL(timeout()), | 42 | SIGNAL(timeout()), |
43 | this, | 43 | this, |
44 | SLOT(slotInquiryTimeout())); | 44 | SLOT(slotInquiryTimeout())); |
45 | 45 | ||
46 | Driver = Drv; | 46 | Driver = Drv; |
47 | Socket = Drv->openSocket(); | 47 | Socket = Drv->openSocket(); |
48 | Socket->open(); | 48 | Socket->open(); |
49 | 49 | ||
50 | connect( Socket, | 50 | connect( Socket, |
51 | SIGNAL( event(unsigned char, QByteArray)), | 51 | SIGNAL( event(unsigned char, QByteArray)), |
52 | this, | 52 | this, |
53 | SLOT(slotHCIEvent(unsigned char, QByteArray))); | 53 | SLOT(slotHCIEvent(unsigned char, QByteArray))); |
54 | } | 54 | } |
55 | 55 | ||
56 | OTInquiry::~OTInquiry() { | 56 | OTInquiry::~OTInquiry() { |
57 | stopInquiring(); | 57 | stopInquiring(); |
58 | } | 58 | } |
59 | 59 | ||
60 | void OTInquiry::stopInquiring( void ) { | 60 | void OTInquiry::stopInquiring( void ) { |
61 | if( Socket ) { | 61 | if( Socket ) { |
62 | owarn << "Stop inquiry" << oendl; | 62 | odebug << "Stop inquiry" << oendl; |
63 | Driver->closeSocket(); | 63 | Driver->closeSocket(); |
64 | Socket = 0; | 64 | Socket = 0; |
65 | } | 65 | } |
66 | } | 66 | } |
67 | 67 | ||
68 | bool OTInquiry::inquire( double timeout, int numResponses, int lap) { | 68 | bool OTInquiry::inquire( double timeout, int numResponses, int lap) { |
69 | 69 | ||
70 | QByteArray cmdBuf(5); | 70 | QByteArray cmdBuf(5); |
71 | 71 | ||
72 | cmdBuf[0] = lap & 0xFF; | 72 | cmdBuf[0] = lap & 0xFF; |
73 | cmdBuf[1] = (lap >> 8) & 0xFF; | 73 | cmdBuf[1] = (lap >> 8) & 0xFF; |
74 | cmdBuf[2] = (lap >> 16) & 0xFF; | 74 | cmdBuf[2] = (lap >> 16) & 0xFF; |
75 | cmdBuf[3] = max(0x01, min(0x30, int(timeout/1.28))); | 75 | cmdBuf[3] = max(0x01, min(0x30, int(timeout/1.28))); |
76 | cmdBuf[4] = (unsigned char)numResponses; | 76 | cmdBuf[4] = (unsigned char)numResponses; |
77 | 77 | ||
78 | owarn << "Send HCI inquiry command. wait for " << cmdBuf[3] << oendl; | 78 | odebug << "Send HCI inquiry command. wait for " << cmdBuf[3] << oendl; |
79 | 79 | ||
80 | Socket->sendCommand(0x01, 0x0001, cmdBuf); | 80 | Socket->sendCommand(0x01, 0x0001, cmdBuf); |
81 | 81 | ||
82 | int status; | 82 | int status; |
83 | 83 | ||
84 | if( Socket->readStatus(0x01, 0x0001, &status)) { | 84 | if( Socket->readStatus(0x01, 0x0001, &status)) { |
85 | if (status == 0) { | 85 | if (status == 0) { |
86 | SuccessfullyStarted = true; | 86 | SuccessfullyStarted = true; |
87 | InquiryTimeoutTimer->start( int(1000*(timeout+1.0)), true); | 87 | InquiryTimeoutTimer->start( int(1000*(timeout+1.0)), true); |
88 | return true; | 88 | return true; |
89 | } | 89 | } |
90 | else { | 90 | else { |
91 | QString S =QString().sprintf( "%x", status ); | 91 | QString S =QString().sprintf( "%x", status ); |
92 | owarn << "OTInquiry::inquiry() failed: 0x" << S << oendl; | 92 | odebug << "OTInquiry::inquiry() failed: 0x" << S << oendl; |
93 | emit finished(); | 93 | emit finished(); |
94 | return false; | 94 | return false; |
95 | } | 95 | } |
96 | } else { | 96 | } else { |
97 | owarn << "OTInquiry::inquiry(): Timeout." << oendl; | 97 | odebug << "OTInquiry::inquiry(): Timeout." << oendl; |
98 | return false; | 98 | return false; |
99 | } | 99 | } |
100 | } | 100 | } |
101 | 101 | ||
102 | bool OTInquiry::isInquiring() { | 102 | bool OTInquiry::isInquiring() { |
103 | return InquiryTimeoutTimer->isActive(); | 103 | return InquiryTimeoutTimer->isActive(); |
104 | } | 104 | } |
105 | 105 | ||
106 | bool OTInquiry::isFinished() { | 106 | bool OTInquiry::isFinished() { |
107 | return SuccessfullyStarted && SuccessfullyEnded; | 107 | return SuccessfullyStarted && SuccessfullyEnded; |
108 | } | 108 | } |
109 | 109 | ||
110 | void OTInquiry::reset() { | 110 | void OTInquiry::reset() { |
111 | 111 | ||
112 | SuccessfullyStarted = false; | 112 | SuccessfullyStarted = false; |
113 | SuccessfullyEnded = false; | 113 | SuccessfullyEnded = false; |
114 | //addrCache.clear(); | 114 | //addrCache.clear(); |
115 | //infoQueue.clear(); | 115 | //infoQueue.clear(); |
116 | } | 116 | } |
117 | 117 | ||
118 | 118 | ||
119 | void OTInquiry::onPeerFound( OTPeer * Peer, bool IsNew ) { | 119 | void OTInquiry::onPeerFound( OTPeer * Peer, bool IsNew ) { |
120 | emit peerFound( Peer, IsNew ); | 120 | emit peerFound( Peer, IsNew ); |
121 | } | 121 | } |
122 | 122 | ||
123 | void OTInquiry::slotInquiryTimeout() { | 123 | void OTInquiry::slotInquiryTimeout() { |
124 | emit error( tr( "Timeout while waiting for end of inquiry.") ); | 124 | emit error( tr( "Timeout while waiting for end of inquiry.") ); |
125 | } | 125 | } |
126 | 126 | ||
127 | void OTInquiry::slotHCIEvent(unsigned char eventCode, QByteArray buf) { | 127 | void OTInquiry::slotHCIEvent(unsigned char eventCode, QByteArray buf) { |
128 | 128 | ||
129 | owarn << "OTInquiry: hci packet received: eventCode=" | 129 | odebug << "OTInquiry: hci packet received: eventCode=" |
130 | << (unsigned int)eventCode | 130 | << (unsigned int)eventCode |
131 | << " packetLength=" | 131 | << " packetLength=" |
132 | << (unsigned int)buf.size() | 132 | << (unsigned int)buf.size() |
133 | << oendl; | 133 | << oendl; |
134 | 134 | ||
135 | unsigned char *data = (unsigned char*)buf.data(); | 135 | unsigned char *data = (unsigned char*)buf.data(); |
136 | switch (eventCode) { | 136 | switch (eventCode) { |
137 | case EVT_INQUIRY_COMPLETE: | 137 | case EVT_INQUIRY_COMPLETE: |
138 | { unsigned char status = data[0]; | 138 | { unsigned char status = data[0]; |
139 | owarn << "EVT_INQUIRY_COMPLETE status=" << status << oendl; | 139 | odebug << "EVT_INQUIRY_COMPLETE status=" << status << oendl; |
140 | InquiryTimeoutTimer->stop(); | 140 | InquiryTimeoutTimer->stop(); |
141 | if (status == 0) { | 141 | if (status == 0) { |
142 | if( SuccessfullyStarted == true) { | 142 | if( SuccessfullyStarted == true) { |
143 | owarn << "OTInquiry ended successfully" << oendl; | 143 | odebug << "OTInquiry ended successfully" << oendl; |
144 | SuccessfullyEnded = true; | 144 | SuccessfullyEnded = true; |
145 | } | 145 | } |
146 | emit finished(); | 146 | emit finished(); |
147 | } | 147 | } |
148 | else { | 148 | else { |
149 | emit error( tr( "OTInquiry completed with error (code %1)" ). | 149 | emit error( tr( "OTInquiry completed with error (code %1)" ). |
150 | arg(status)); | 150 | arg(status)); |
151 | } | 151 | } |
152 | } | 152 | } |
153 | break; | 153 | break; |
154 | case EVT_INQUIRY_RESULT: | 154 | case EVT_INQUIRY_RESULT: |
155 | { int numResults = data[0]; | 155 | { int numResults = data[0]; |
156 | OTPeer * P = 0; | 156 | OTPeer * P = 0; |
157 | bool IsNew; | 157 | bool IsNew; |
158 | OTDeviceAddress Addr; | 158 | OTDeviceAddress Addr; |
159 | QString N; | 159 | QString N; |
160 | 160 | ||
161 | inquiry_info *results = (inquiry_info*)(data+1); | 161 | inquiry_info *results = (inquiry_info*)(data+1); |
162 | 162 | ||
163 | for (int n=0; n<numResults; n++) { | 163 | for (int n=0; n<numResults; n++) { |
164 | Addr.setBDAddr( results[n].bdaddr ); | 164 | Addr.setBDAddr( results[n].bdaddr ); |
165 | 165 | ||
166 | owarn << "INQUIRY_RESULT: " | 166 | odebug << "INQUIRY_RESULT: " |
167 | << Addr.toString() | 167 | << Addr.toString() |
168 | << oendl; | 168 | << oendl; |
169 | 169 | ||
170 | P = Driver->gateway()->findPeer( Addr ); | 170 | P = Driver->gateway()->findPeer( Addr ); |
171 | 171 | ||
172 | if( P ) { | 172 | if( P ) { |
173 | // peer known | 173 | // peer known |
174 | if( P->state() != OTPeer::Peer_Up ) { | 174 | if( P->state() != OTPeer::Peer_Up ) { |
175 | P->setState( OTPeer::Peer_Up ); | 175 | P->setState( OTPeer::Peer_Up ); |
176 | } | 176 | } |
177 | IsNew = 0; | 177 | IsNew = 0; |
178 | } else { | 178 | } else { |
179 | IsNew = 1; | 179 | IsNew = 1; |
180 | // push the address to the address queue | 180 | // push the address to the address queue |
181 | // where it can be consumed by nextNeighbour() | 181 | // where it can be consumed by nextNeighbour() |
182 | P = new OTPeer( Driver->gateway() ); | 182 | P = new OTPeer( Driver->gateway() ); |
183 | P->setState( OTPeer::Peer_Up ); // we just detected it | 183 | P->setState( OTPeer::Peer_Up ); // we just detected it |
184 | P->setAddress( Addr ); | 184 | P->setAddress( Addr ); |
185 | //if( addrCache.find(info.addr) == addrCache.end()) { | 185 | //if( addrCache.find(info.addr) == addrCache.end()) { |
186 | // addrCache.insert(info.addr); | 186 | // addrCache.insert(info.addr); |
187 | 187 | ||
188 | P->setDeviceClass( (results[n].dev_class[0] << 16) | | 188 | P->setDeviceClass( (results[n].dev_class[0] << 16) | |
189 | (results[n].dev_class[1] << 8) | | 189 | (results[n].dev_class[1] << 8) | |
190 | (results[n].dev_class[2] << 0) ); | 190 | (results[n].dev_class[2] << 0) ); |
191 | // infoQueue.push_back(info); | 191 | // infoQueue.push_back(info); |
192 | P->setName( Driver->getPeerName( Addr ) ); | 192 | P->setName( Driver->getPeerName( Addr ) ); |
193 | } | 193 | } |
194 | 194 | ||
195 | // call the handler. Emits a signal if not overwritten | 195 | // call the handler. Emits a signal if not overwritten |
196 | onPeerFound( P, IsNew ); | 196 | onPeerFound( P, IsNew ); |
197 | 197 | ||
198 | // } | 198 | // } |
199 | } | 199 | } |
200 | } | 200 | } |
201 | break; | 201 | break; |
202 | case EVT_CMD_STATUS : | 202 | case EVT_CMD_STATUS : |
203 | { int status = data[0]; | 203 | { int status = data[0]; |
204 | int numHciCmdPkts = data[1]; | 204 | int numHciCmdPkts = data[1]; |
205 | int cmdOpcode = *((uint16_t*)(data+2)); | 205 | int cmdOpcode = *((uint16_t*)(data+2)); |
206 | owarn << "EVT_CMD_STATUS status=" | 206 | odebug << "EVT_CMD_STATUS status=" |
207 | << status | 207 | << status |
208 | << " numPkts=" | 208 | << " numPkts=" |
209 | << numHciCmdPkts | 209 | << numHciCmdPkts |
210 | << " cmdOpcode=" | 210 | << " cmdOpcode=" |
211 | << cmdOpcode | 211 | << cmdOpcode |
212 | << oendl; | 212 | << oendl; |
213 | if (cmdOpcode == OCF_INQUIRY) { | 213 | if (cmdOpcode == OCF_INQUIRY) { |
214 | 214 | ||
215 | } | 215 | } |
216 | } | 216 | } |
217 | break; | 217 | break; |
218 | } | 218 | } |
219 | } | 219 | } |
diff --git a/noncore/settings/networksettings2/opietooth2/OTPeer.cpp b/noncore/settings/networksettings2/opietooth2/OTPeer.cpp index 0d7e943..2272f04 100644 --- a/noncore/settings/networksettings2/opietooth2/OTPeer.cpp +++ b/noncore/settings/networksettings2/opietooth2/OTPeer.cpp | |||
@@ -1,366 +1,366 @@ | |||
1 | //-*-c++-*- | 1 | //-*-c++-*- |
2 | /*************************************************************************** | 2 | /*************************************************************************** |
3 | * Copyright (C) 2003 by Fred Schaettgen * | 3 | * Copyright (C) 2003 by Fred Schaettgen * |
4 | * kdebluetooth@schaettgen.de * | 4 | * kdebluetooth@schaettgen.de * |
5 | * * | 5 | * * |
6 | * This program is free software; you can redistribute it and/or modify * | 6 | * This program is free software; you can redistribute it and/or modify * |
7 | * it under the terms of the GNU General Public License as published by * | 7 | * it under the terms of the GNU General Public License as published by * |
8 | * the Free Software Foundation; either version 2 of the License, or * | 8 | * the Free Software Foundation; either version 2 of the License, or * |
9 | * (at your option) any later version. * | 9 | * (at your option) any later version. * |
10 | ***************************************************************************/ | 10 | ***************************************************************************/ |
11 | 11 | ||
12 | #include <assert.h> | 12 | #include <assert.h> |
13 | #include <sys/poll.h> | 13 | #include <sys/poll.h> |
14 | #include <string.h> | 14 | #include <string.h> |
15 | 15 | ||
16 | #include <bluezlib.h> | 16 | #include <bluezlib.h> |
17 | #include <qarray.h> | 17 | #include <qarray.h> |
18 | #include <qtextstream.h> | 18 | #include <qtextstream.h> |
19 | 19 | ||
20 | #include <opie2/odebug.h> | 20 | #include <opie2/odebug.h> |
21 | 21 | ||
22 | #include <OTDeviceAddress.h> | 22 | #include <OTDeviceAddress.h> |
23 | #include <OTSDPAttribute.h> | 23 | #include <OTSDPAttribute.h> |
24 | #include <OTSDPService.h> | 24 | #include <OTSDPService.h> |
25 | #include <OTPeer.h> | 25 | #include <OTPeer.h> |
26 | #include <OTGateway.h> | 26 | #include <OTGateway.h> |
27 | #include <OTDriver.h> | 27 | #include <OTDriver.h> |
28 | 28 | ||
29 | using namespace Opietooth2; | 29 | using namespace Opietooth2; |
30 | 30 | ||
31 | OTPeer::OTPeer( OTGateway * _OT ) { | 31 | OTPeer::OTPeer( OTGateway * _OT ) { |
32 | OT = _OT; | 32 | OT = _OT; |
33 | State = Peer_Unknown; | 33 | State = Peer_Unknown; |
34 | ConnectedTo = 0; | 34 | ConnectedTo = 0; |
35 | } | 35 | } |
36 | 36 | ||
37 | OTPeer::OTPeer( QTextStream & TS, OTGateway * _OT ) { | 37 | OTPeer::OTPeer( QTextStream & TS, OTGateway * _OT ) { |
38 | OT = _OT; | 38 | OT = _OT; |
39 | State = Peer_Unknown; | 39 | State = Peer_Unknown; |
40 | ConnectedTo = 0; | 40 | ConnectedTo = 0; |
41 | 41 | ||
42 | load( TS ); | 42 | load( TS ); |
43 | } | 43 | } |
44 | 44 | ||
45 | OTPeer::~OTPeer( ) { | 45 | OTPeer::~OTPeer( ) { |
46 | 46 | ||
47 | } | 47 | } |
48 | 48 | ||
49 | void OTPeer::updateServices( void ) { | 49 | void OTPeer::updateServices( void ) { |
50 | sdp_session_t *session; | 50 | sdp_session_t *session; |
51 | 51 | ||
52 | serviceList.clear(); | 52 | serviceList.clear(); |
53 | 53 | ||
54 | owarn << "Get services from " << Addr.toString() << oendl; | 54 | odebug << "Get services from " << Addr.toString() << oendl; |
55 | 55 | ||
56 | session = sdp_connect( &(OTDeviceAddress::any.getBDAddr()), | 56 | session = sdp_connect( &(OTDeviceAddress::any.getBDAddr()), |
57 | &(Addr.getBDAddr()), | 57 | &(Addr.getBDAddr()), |
58 | 0); | 58 | 0); |
59 | 59 | ||
60 | if (!session) { | 60 | if (!session) { |
61 | owarn << "sdp_connect(" | 61 | odebug << "sdp_connect(" |
62 | << Addr.toString() | 62 | << Addr.toString() |
63 | << ") failed" | 63 | << ") failed" |
64 | << oendl; | 64 | << oendl; |
65 | return; // error | 65 | return; // error |
66 | } | 66 | } |
67 | 67 | ||
68 | uint32_t range = 0x0000ffff; | 68 | uint32_t range = 0x0000ffff; |
69 | sdp_list_t* attrId = sdp_list_append(0, &range); | 69 | sdp_list_t* attrId = sdp_list_append(0, &range); |
70 | 70 | ||
71 | // search all public features | 71 | // search all public features |
72 | uuid_t grp; | 72 | uuid_t grp; |
73 | sdp_uuid16_create( &grp, PUBLIC_BROWSE_GROUP ); | 73 | sdp_uuid16_create( &grp, PUBLIC_BROWSE_GROUP ); |
74 | sdp_list_t * search = sdp_list_append(0, &grp ); | 74 | sdp_list_t * search = sdp_list_append(0, &grp ); |
75 | 75 | ||
76 | // get data from peer | 76 | // get data from peer |
77 | sdp_list_t* seq; | 77 | sdp_list_t* seq; |
78 | if (sdp_service_search_attr_req( session, | 78 | if (sdp_service_search_attr_req( session, |
79 | search, | 79 | search, |
80 | SDP_ATTR_REQ_RANGE, | 80 | SDP_ATTR_REQ_RANGE, |
81 | attrId, | 81 | attrId, |
82 | &seq ) ) { | 82 | &seq ) ) { |
83 | owarn << "Service Search failed" << oendl; | 83 | odebug << "Service Search failed" << oendl; |
84 | sdp_close(session); | 84 | sdp_close(session); |
85 | return; | 85 | return; |
86 | } | 86 | } |
87 | 87 | ||
88 | sdp_list_free(attrId, 0); | 88 | sdp_list_free(attrId, 0); |
89 | sdp_list_free(search, 0); | 89 | sdp_list_free(search, 0); |
90 | 90 | ||
91 | // process result | 91 | // process result |
92 | sdp_list_t* next = NULL; | 92 | sdp_list_t* next = NULL; |
93 | 93 | ||
94 | for (; seq; seq = next) { | 94 | for (; seq; seq = next) { |
95 | sdp_record_t *rec = (sdp_record_t *) seq->data; | 95 | sdp_record_t *rec = (sdp_record_t *) seq->data; |
96 | 96 | ||
97 | sdp_list_t* attrlist = rec->attrlist; | 97 | sdp_list_t* attrlist = rec->attrlist; |
98 | AttributeVector alist; | 98 | AttributeVector alist; |
99 | OTSDPService * service; | 99 | OTSDPService * service; |
100 | 100 | ||
101 | service = new OTSDPService(); | 101 | service = new OTSDPService(); |
102 | 102 | ||
103 | for (; attrlist; attrlist = attrlist->next) { | 103 | for (; attrlist; attrlist = attrlist->next) { |
104 | int attrID = ((sdp_data_t*)(attrlist->data))->attrId; | 104 | int attrID = ((sdp_data_t*)(attrlist->data))->attrId; |
105 | service->addAttribute( | 105 | service->addAttribute( |
106 | attrID, | 106 | attrID, |
107 | new OTSDPAttribute( (sdp_data_t*)(attrlist->data) ) | 107 | new OTSDPAttribute( (sdp_data_t*)(attrlist->data) ) |
108 | ); | 108 | ); |
109 | } | 109 | } |
110 | 110 | ||
111 | serviceList.resize( serviceList.size() + 1 ); | 111 | serviceList.resize( serviceList.size() + 1 ); |
112 | serviceList.insert( serviceList.size() - 1, service ); | 112 | serviceList.insert( serviceList.size() - 1, service ); |
113 | 113 | ||
114 | next = seq->next; | 114 | next = seq->next; |
115 | free(seq); | 115 | free(seq); |
116 | sdp_record_free(rec); | 116 | sdp_record_free(rec); |
117 | } | 117 | } |
118 | sdp_close(session); | 118 | sdp_close(session); |
119 | } | 119 | } |
120 | 120 | ||
121 | bool OTPeer::hasServiceClassID( const OTUUID & uuid) { | 121 | bool OTPeer::hasServiceClassID( const OTUUID & uuid) { |
122 | for( unsigned int i = 0; | 122 | for( unsigned int i = 0; |
123 | i < serviceList.count(); | 123 | i < serviceList.count(); |
124 | i ++ ) { | 124 | i ++ ) { |
125 | if( serviceList[i]->hasClassID(uuid)) | 125 | if( serviceList[i]->hasClassID(uuid)) |
126 | return true; | 126 | return true; |
127 | } | 127 | } |
128 | return false; | 128 | return false; |
129 | } | 129 | } |
130 | /** Get a vector of Rfcomm channels of the services having "uuid" in the class ID List*/ | 130 | /** Get a vector of Rfcomm channels of the services having "uuid" in the class ID List*/ |
131 | QArray<int> OTPeer::rfcommList( const OTUUID & uuid) { | 131 | QArray<int> OTPeer::rfcommList( const OTUUID & uuid) { |
132 | 132 | ||
133 | QArray<int> rfcommList; | 133 | QArray<int> rfcommList; |
134 | unsigned int channel; | 134 | unsigned int channel; |
135 | 135 | ||
136 | for( unsigned int i = 0; | 136 | for( unsigned int i = 0; |
137 | i < serviceList.count(); | 137 | i < serviceList.count(); |
138 | i ++ ) { | 138 | i ++ ) { |
139 | if( serviceList[i]->hasClassID(uuid)) { | 139 | if( serviceList[i]->hasClassID(uuid)) { |
140 | if( serviceList[i]->rfcommChannel(channel) ) { | 140 | if( serviceList[i]->rfcommChannel(channel) ) { |
141 | rfcommList.resize( rfcommList.size()+1 ); | 141 | rfcommList.resize( rfcommList.size()+1 ); |
142 | rfcommList[rfcommList.size()-1] = channel; | 142 | rfcommList[rfcommList.size()-1] = channel; |
143 | } | 143 | } |
144 | } | 144 | } |
145 | } | 145 | } |
146 | return rfcommList; | 146 | return rfcommList; |
147 | } | 147 | } |
148 | 148 | ||
149 | void OTPeer::save( QTextStream & TS ) { | 149 | void OTPeer::save( QTextStream & TS ) { |
150 | TS << "bdaddr " << address().toString() << endl; | 150 | TS << "bdaddr " << address().toString() << endl; |
151 | TS << "name " << name() << endl; | 151 | TS << "name " << name() << endl; |
152 | TS << "class " << deviceClass() << endl; | 152 | TS << "class " << deviceClass() << endl; |
153 | } | 153 | } |
154 | 154 | ||
155 | void OTPeer::load( QTextStream & TS ) { | 155 | void OTPeer::load( QTextStream & TS ) { |
156 | QString S; | 156 | QString S; |
157 | S = TS.readLine(); | 157 | S = TS.readLine(); |
158 | setAddress( OTDeviceAddress( S.mid( 7 ) ) ); | 158 | setAddress( OTDeviceAddress( S.mid( 7 ) ) ); |
159 | 159 | ||
160 | S = TS.readLine(); | 160 | S = TS.readLine(); |
161 | setName( S.mid( 5 ) ); | 161 | setName( S.mid( 5 ) ); |
162 | 162 | ||
163 | S = TS.readLine(); | 163 | S = TS.readLine(); |
164 | setDeviceClass( S.mid( 6 ).toLong() ); | 164 | setDeviceClass( S.mid( 6 ).toLong() ); |
165 | } | 165 | } |
166 | 166 | ||
167 | #define MAGICNR -99999 | 167 | #define MAGICNR -99999 |
168 | #define POLLDELAY 1000 | 168 | #define POLLDELAY 1000 |
169 | #define PREMAGICNR (MAGICNR+POLLDELAY) | 169 | #define PREMAGICNR (MAGICNR+POLLDELAY) |
170 | 170 | ||
171 | void OTPeer::findOutState( int timeoutInSec, bool Force ) { | 171 | void OTPeer::findOutState( int timeoutInSec, bool Force ) { |
172 | ProbeFD = -1; | 172 | ProbeFD = -1; |
173 | if( Force && ConnectedTo == 0 ) { | 173 | if( Force && ConnectedTo == 0 ) { |
174 | State = OTPeer::Peer_Unknown; | 174 | State = OTPeer::Peer_Unknown; |
175 | } // else keep state or is connected to us | 175 | } // else keep state or is connected to us |
176 | 176 | ||
177 | if( State == OTPeer::Peer_Unknown ) { | 177 | if( State == OTPeer::Peer_Unknown ) { |
178 | ProbePhase = 0; | 178 | ProbePhase = 0; |
179 | ProbeTimeout = timeoutInSec*1000; | 179 | ProbeTimeout = timeoutInSec*1000; |
180 | owarn << "Ping " << address().toString() << oendl; | 180 | odebug << "Ping " << address().toString() << oendl; |
181 | startTimer( POLLDELAY ); | 181 | startTimer( POLLDELAY ); |
182 | } else { | 182 | } else { |
183 | ProbeTimeout = 0; | 183 | ProbeTimeout = 0; |
184 | startTimer( 0 ); | 184 | startTimer( 0 ); |
185 | } | 185 | } |
186 | } | 186 | } |
187 | 187 | ||
188 | #define PINGSIZE 20 | 188 | #define PINGSIZE 20 |
189 | void OTPeer::timerEvent( QTimerEvent * ev ) { | 189 | void OTPeer::timerEvent( QTimerEvent * ev ) { |
190 | 190 | ||
191 | ProbeTimeout -= POLLDELAY; | 191 | ProbeTimeout -= POLLDELAY; |
192 | 192 | ||
193 | if( State == OTPeer::Peer_Unknown ) { | 193 | if( State == OTPeer::Peer_Unknown ) { |
194 | switch( ProbePhase ) { | 194 | switch( ProbePhase ) { |
195 | case 0 : // connect nonblock | 195 | case 0 : // connect nonblock |
196 | { struct sockaddr_l2 addr; | 196 | { struct sockaddr_l2 addr; |
197 | 197 | ||
198 | if (( ProbeFD = ::socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP)) < 0) { | 198 | if (( ProbeFD = ::socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP)) < 0) { |
199 | ProbeTimeout = 0; | 199 | ProbeTimeout = 0; |
200 | break; | 200 | break; |
201 | } | 201 | } |
202 | 202 | ||
203 | memset(&addr, 0, sizeof(addr)); | 203 | memset(&addr, 0, sizeof(addr)); |
204 | 204 | ||
205 | addr.l2_family = AF_BLUETOOTH; | 205 | addr.l2_family = AF_BLUETOOTH; |
206 | addr.l2_bdaddr = OTDeviceAddress::any.getBDAddr(); | 206 | addr.l2_bdaddr = OTDeviceAddress::any.getBDAddr(); |
207 | 207 | ||
208 | if( ::bind( ProbeFD, (struct sockaddr *) &addr, sizeof(addr)) < 0) { | 208 | if( ::bind( ProbeFD, (struct sockaddr *) &addr, sizeof(addr)) < 0) { |
209 | ProbeTimeout = 0; | 209 | ProbeTimeout = 0; |
210 | break; | 210 | break; |
211 | } | 211 | } |
212 | 212 | ||
213 | // non blocking | 213 | // non blocking |
214 | if( ::fcntl( ProbeFD, F_SETFL, O_NONBLOCK ) < 0 ) { | 214 | if( ::fcntl( ProbeFD, F_SETFL, O_NONBLOCK ) < 0 ) { |
215 | ProbeTimeout = 0; | 215 | ProbeTimeout = 0; |
216 | break; | 216 | break; |
217 | } | 217 | } |
218 | 218 | ||
219 | // to this peer | 219 | // to this peer |
220 | addr.l2_bdaddr = address().getBDAddr(); | 220 | addr.l2_bdaddr = address().getBDAddr(); |
221 | if( ::connect( ProbeFD, (struct sockaddr *) &addr, sizeof(addr)) < 0) { | 221 | if( ::connect( ProbeFD, (struct sockaddr *) &addr, sizeof(addr)) < 0) { |
222 | if( errno != EAGAIN && errno != EINPROGRESS ) { | 222 | if( errno != EAGAIN && errno != EINPROGRESS ) { |
223 | ProbeTimeout = 0; | 223 | ProbeTimeout = 0; |
224 | break; | 224 | break; |
225 | } // wait for connect to fail or succeed | 225 | } // wait for connect to fail or succeed |
226 | } | 226 | } |
227 | } | 227 | } |
228 | ProbePhase = 1; // wait for connect | 228 | ProbePhase = 1; // wait for connect |
229 | break; | 229 | break; |
230 | case 1 : | 230 | case 1 : |
231 | { struct pollfd pf[1]; | 231 | { struct pollfd pf[1]; |
232 | char buf[L2CAP_CMD_HDR_SIZE + PINGSIZE + 20]; | 232 | char buf[L2CAP_CMD_HDR_SIZE + PINGSIZE + 20]; |
233 | int n; | 233 | int n; |
234 | 234 | ||
235 | pf[0].fd = ProbeFD; | 235 | pf[0].fd = ProbeFD; |
236 | pf[0].events = POLLOUT; | 236 | pf[0].events = POLLOUT; |
237 | if( (n = ::poll(pf, 1, 0)) < 0 ) { | 237 | if( (n = ::poll(pf, 1, 0)) < 0 ) { |
238 | owarn << address().toString() | 238 | odebug << address().toString() |
239 | << " : errno " | 239 | << " : errno " |
240 | << errno | 240 | << errno |
241 | << " " | 241 | << " " |
242 | << strerror(errno)<<oendl; | 242 | << strerror(errno)<<oendl; |
243 | ProbeTimeout = 0; | 243 | ProbeTimeout = 0; |
244 | break; | 244 | break; |
245 | } | 245 | } |
246 | 246 | ||
247 | if( ! n ) { | 247 | if( ! n ) { |
248 | // not ready -> try again | 248 | // not ready -> try again |
249 | break; | 249 | break; |
250 | } | 250 | } |
251 | 251 | ||
252 | // send ping | 252 | // send ping |
253 | for( unsigned int i = L2CAP_CMD_HDR_SIZE; i < sizeof(buf); i++) | 253 | for( unsigned int i = L2CAP_CMD_HDR_SIZE; i < sizeof(buf); i++) |
254 | buf[i] = (i % 40) + 'A'; | 254 | buf[i] = (i % 40) + 'A'; |
255 | 255 | ||
256 | l2cap_cmd_hdr *cmd = (l2cap_cmd_hdr *) buf; | 256 | l2cap_cmd_hdr *cmd = (l2cap_cmd_hdr *) buf; |
257 | 257 | ||
258 | /* Build command header */ | 258 | /* Build command header */ |
259 | cmd->code = L2CAP_ECHO_REQ; | 259 | cmd->code = L2CAP_ECHO_REQ; |
260 | cmd->ident = *(char *)this; // get some byte | 260 | cmd->ident = *(char *)this; // get some byte |
261 | cmd->len = PINGSIZE; | 261 | cmd->len = PINGSIZE; |
262 | 262 | ||
263 | /* Send Echo Request */ | 263 | /* Send Echo Request */ |
264 | if( ::send(ProbeFD, buf, PINGSIZE + L2CAP_CMD_HDR_SIZE, 0) <= 0) { | 264 | if( ::send(ProbeFD, buf, PINGSIZE + L2CAP_CMD_HDR_SIZE, 0) <= 0) { |
265 | if( errno == EACCES ) { | 265 | if( errno == EACCES ) { |
266 | // permission denied means that we could not | 266 | // permission denied means that we could not |
267 | // connect because the device does not allow us | 267 | // connect because the device does not allow us |
268 | // but it is UP | 268 | // but it is UP |
269 | owarn << address().toString() | 269 | odebug << address().toString() |
270 | << " good send error " | 270 | << " good send error " |
271 | << errno | 271 | << errno |
272 | << " " | 272 | << " " |
273 | << strerror( errno) | 273 | << strerror( errno) |
274 | << oendl; | 274 | << oendl; |
275 | State = OTPeer::Peer_Up; | 275 | State = OTPeer::Peer_Up; |
276 | ProbeTimeout = 0; | 276 | ProbeTimeout = 0; |
277 | break; | 277 | break; |
278 | } else if( errno != EBUSY ) { | 278 | } else if( errno != EBUSY ) { |
279 | owarn << address().toString() | 279 | odebug << address().toString() |
280 | << " : errno " | 280 | << " : errno " |
281 | << errno | 281 | << errno |
282 | << " " | 282 | << " " |
283 | << strerror(errno) | 283 | << strerror(errno) |
284 | << oendl; | 284 | << oendl; |
285 | ProbeTimeout = 0; | 285 | ProbeTimeout = 0; |
286 | break; | 286 | break; |
287 | } // else want some more | 287 | } // else want some more |
288 | } | 288 | } |
289 | 289 | ||
290 | ProbePhase = 2; // wait for ping reply | 290 | ProbePhase = 2; // wait for ping reply |
291 | } | 291 | } |
292 | break; | 292 | break; |
293 | case 2 : // wait for reply | 293 | case 2 : // wait for reply |
294 | { struct pollfd pf[1]; | 294 | { struct pollfd pf[1]; |
295 | char buf[L2CAP_CMD_HDR_SIZE + PINGSIZE + 20]; | 295 | char buf[L2CAP_CMD_HDR_SIZE + PINGSIZE + 20]; |
296 | l2cap_cmd_hdr *cmd = (l2cap_cmd_hdr *) buf; | 296 | l2cap_cmd_hdr *cmd = (l2cap_cmd_hdr *) buf; |
297 | int n; | 297 | int n; |
298 | 298 | ||
299 | pf[0].fd = ProbeFD; | 299 | pf[0].fd = ProbeFD; |
300 | pf[0].events = POLLIN; | 300 | pf[0].events = POLLIN; |
301 | if( (n = ::poll(pf, 1, 0)) < 0 ) { | 301 | if( (n = ::poll(pf, 1, 0)) < 0 ) { |
302 | owarn << address().toString() | 302 | odebug << address().toString() |
303 | << " : errno " | 303 | << " : errno " |
304 | << errno | 304 | << errno |
305 | << " " | 305 | << " " |
306 | << strerror(errno) | 306 | << strerror(errno) |
307 | <<oendl; | 307 | <<oendl; |
308 | ProbeTimeout = 0; | 308 | ProbeTimeout = 0; |
309 | break; | 309 | break; |
310 | } | 310 | } |
311 | 311 | ||
312 | if( ! n ) { | 312 | if( ! n ) { |
313 | // not ready -> try again | 313 | // not ready -> try again |
314 | break; | 314 | break; |
315 | } | 315 | } |
316 | 316 | ||
317 | if( (n = ::recv( ProbeFD, buf, sizeof(buf), 0)) < 0) { | 317 | if( (n = ::recv( ProbeFD, buf, sizeof(buf), 0)) < 0) { |
318 | owarn << address().toString() | 318 | odebug << address().toString() |
319 | << "errno " | 319 | << "errno " |
320 | << errno | 320 | << errno |
321 | << " " | 321 | << " " |
322 | << strerror(errno) | 322 | << strerror(errno) |
323 | << oendl; | 323 | << oendl; |
324 | ProbeTimeout = 0; | 324 | ProbeTimeout = 0; |
325 | break; | 325 | break; |
326 | } | 326 | } |
327 | 327 | ||
328 | /* Check for our id */ | 328 | /* Check for our id */ |
329 | if( cmd->ident != *(char *)this ) | 329 | if( cmd->ident != *(char *)this ) |
330 | // not our reply | 330 | // not our reply |
331 | break; | 331 | break; |
332 | 332 | ||
333 | owarn << "reply from " | 333 | odebug << "reply from " |
334 | << address().toString() | 334 | << address().toString() |
335 | << oendl; | 335 | << oendl; |
336 | // whatever reply we get is a valid reply | 336 | // whatever reply we get is a valid reply |
337 | State = OTPeer::Peer_Up; | 337 | State = OTPeer::Peer_Up; |
338 | ProbeTimeout = 0; | 338 | ProbeTimeout = 0; |
339 | } | 339 | } |
340 | break; | 340 | break; |
341 | } | 341 | } |
342 | 342 | ||
343 | if( State != OTPeer::Peer_Unknown ) { | 343 | if( State != OTPeer::Peer_Unknown ) { |
344 | ProbeTimeout = 0; | 344 | ProbeTimeout = 0; |
345 | } | 345 | } |
346 | } | 346 | } |
347 | 347 | ||
348 | if( ProbeTimeout <= 0 ) { | 348 | if( ProbeTimeout <= 0 ) { |
349 | // regular timeout | 349 | // regular timeout |
350 | emit peerStateReport( this ); | 350 | emit peerStateReport( this ); |
351 | if( State == Peer_Unknown ) { | 351 | if( State == Peer_Unknown ) { |
352 | State = Peer_Down; | 352 | State = Peer_Down; |
353 | } | 353 | } |
354 | if( ProbeFD >= 0 ) { | 354 | if( ProbeFD >= 0 ) { |
355 | // requested to stop by caller -> stop probing | 355 | // requested to stop by caller -> stop probing |
356 | ::close( ProbeFD ); | 356 | ::close( ProbeFD ); |
357 | } | 357 | } |
358 | // no more waiting | 358 | // no more waiting |
359 | killTimer( ev->timerId() ); | 359 | killTimer( ev->timerId() ); |
360 | } // else sleep some more | 360 | } // else sleep some more |
361 | } | 361 | } |
362 | 362 | ||
363 | void OTPeer::stopFindingOutState( void ) { | 363 | void OTPeer::stopFindingOutState( void ) { |
364 | ProbeTimeout = PREMAGICNR; | 364 | ProbeTimeout = PREMAGICNR; |
365 | } | 365 | } |
366 | 366 | ||
diff --git a/noncore/settings/networksettings2/opietooth2/Opietooth.cpp b/noncore/settings/networksettings2/opietooth2/Opietooth.cpp index b14cc2f..8323549 100644 --- a/noncore/settings/networksettings2/opietooth2/Opietooth.cpp +++ b/noncore/settings/networksettings2/opietooth2/Opietooth.cpp | |||
@@ -1,1167 +1,1167 @@ | |||
1 | #include <opie2/odebug.h> | 1 | #include <opie2/odebug.h> |
2 | #include <opie2/oledbox.h> | 2 | #include <opie2/oledbox.h> |
3 | #include <opie2/ofiledialog.h> | 3 | #include <opie2/ofiledialog.h> |
4 | 4 | ||
5 | using namespace Opie::Core; | 5 | using namespace Opie::Core; |
6 | using namespace Opie::Ui; | 6 | using namespace Opie::Ui; |
7 | 7 | ||
8 | #include <qpe/resource.h> | 8 | #include <qpe/resource.h> |
9 | #include <qapplication.h> | 9 | #include <qapplication.h> |
10 | #include <qcheckbox.h> | 10 | #include <qcheckbox.h> |
11 | #include <qcombobox.h> | 11 | #include <qcombobox.h> |
12 | #include <qdialog.h> | 12 | #include <qdialog.h> |
13 | #include <qdir.h> | 13 | #include <qdir.h> |
14 | #include <qfile.h> | 14 | #include <qfile.h> |
15 | #include <qgroupbox.h> | 15 | #include <qgroupbox.h> |
16 | #include <qheader.h> | 16 | #include <qheader.h> |
17 | #include <qlabel.h> | 17 | #include <qlabel.h> |
18 | #include <qlayout.h> | 18 | #include <qlayout.h> |
19 | #include <qlistbox.h> | 19 | #include <qlistbox.h> |
20 | #include <qlistview.h> | 20 | #include <qlistview.h> |
21 | #include <qmessagebox.h> | 21 | #include <qmessagebox.h> |
22 | #include <qprogressbar.h> | 22 | #include <qprogressbar.h> |
23 | #include <qpushbutton.h> | 23 | #include <qpushbutton.h> |
24 | #include <qscrollbar.h> | 24 | #include <qscrollbar.h> |
25 | #include <qtextstream.h> | 25 | #include <qtextstream.h> |
26 | #include <qtextview.h> | 26 | #include <qtextview.h> |
27 | 27 | ||
28 | #include <Opietooth.h> | 28 | #include <Opietooth.h> |
29 | #include <OTDriver.h> | 29 | #include <OTDriver.h> |
30 | #include <OTPeer.h> | 30 | #include <OTPeer.h> |
31 | #include <OTGateway.h> | 31 | #include <OTGateway.h> |
32 | #include <OTSDPAttribute.h> | 32 | #include <OTSDPAttribute.h> |
33 | #include <OTSDPService.h> | 33 | #include <OTSDPService.h> |
34 | #include <OTInquiry.h> | 34 | #include <OTInquiry.h> |
35 | 35 | ||
36 | #include <system.h> | 36 | #include <system.h> |
37 | 37 | ||
38 | using namespace Opietooth2; | 38 | using namespace Opietooth2; |
39 | 39 | ||
40 | namespace Opietooth2 { | 40 | namespace Opietooth2 { |
41 | 41 | ||
42 | class PeerLVI : public QListViewItem { | 42 | class PeerLVI : public QListViewItem { |
43 | 43 | ||
44 | public : | 44 | public : |
45 | 45 | ||
46 | PeerLVI( OTPeer * P, QListView * it ) : QListViewItem (it) { | 46 | PeerLVI( OTPeer * P, QListView * it ) : QListViewItem (it) { |
47 | Peer = P; | 47 | Peer = P; |
48 | } | 48 | } |
49 | ~PeerLVI( void ) { | 49 | ~PeerLVI( void ) { |
50 | } | 50 | } |
51 | 51 | ||
52 | inline OTPeer * peer( void ) | 52 | inline OTPeer * peer( void ) |
53 | { return Peer; } | 53 | { return Peer; } |
54 | 54 | ||
55 | private : | 55 | private : |
56 | 56 | ||
57 | OTPeer * Peer; | 57 | OTPeer * Peer; |
58 | }; | 58 | }; |
59 | 59 | ||
60 | class ChannelLVI : public QListViewItem { | 60 | class ChannelLVI : public QListViewItem { |
61 | 61 | ||
62 | public : | 62 | public : |
63 | 63 | ||
64 | ChannelLVI( int Ch, QListViewItem * it ) : QListViewItem (it) { | 64 | ChannelLVI( int Ch, QListViewItem * it ) : QListViewItem (it) { |
65 | Channel = Ch; | 65 | Channel = Ch; |
66 | } | 66 | } |
67 | ~ChannelLVI( void ) { | 67 | ~ChannelLVI( void ) { |
68 | } | 68 | } |
69 | 69 | ||
70 | inline int channel( void ) | 70 | inline int channel( void ) |
71 | { return Channel; } | 71 | { return Channel; } |
72 | 72 | ||
73 | private : | 73 | private : |
74 | 74 | ||
75 | int Channel; | 75 | int Channel; |
76 | }; | 76 | }; |
77 | 77 | ||
78 | class DriverLVI : public QListViewItem { | 78 | class DriverLVI : public QListViewItem { |
79 | 79 | ||
80 | public : | 80 | public : |
81 | 81 | ||
82 | DriverLVI( OTDriver * P, QListView * it ) : QListViewItem (it) { | 82 | DriverLVI( OTDriver * P, QListView * it ) : QListViewItem (it) { |
83 | Driver = P; | 83 | Driver = P; |
84 | } | 84 | } |
85 | ~DriverLVI( void ) { | 85 | ~DriverLVI( void ) { |
86 | } | 86 | } |
87 | 87 | ||
88 | inline OTDriver * driver( void ) | 88 | inline OTDriver * driver( void ) |
89 | { return Driver; } | 89 | { return Driver; } |
90 | 90 | ||
91 | private : | 91 | private : |
92 | 92 | ||
93 | OTDriver * Driver; | 93 | OTDriver * Driver; |
94 | }; | 94 | }; |
95 | 95 | ||
96 | class LinkKeyLVI : public QListViewItem { | 96 | class LinkKeyLVI : public QListViewItem { |
97 | 97 | ||
98 | public : | 98 | public : |
99 | 99 | ||
100 | LinkKeyLVI( int Ch, QListView * it ) : QListViewItem (it) { | 100 | LinkKeyLVI( int Ch, QListView * it ) : QListViewItem (it) { |
101 | LinkKey = Ch; | 101 | LinkKey = Ch; |
102 | } | 102 | } |
103 | ~LinkKeyLVI( void ) { | 103 | ~LinkKeyLVI( void ) { |
104 | } | 104 | } |
105 | 105 | ||
106 | inline int index( void ) | 106 | inline int index( void ) |
107 | { return LinkKey; } | 107 | { return LinkKey; } |
108 | 108 | ||
109 | private : | 109 | private : |
110 | 110 | ||
111 | int LinkKey; | 111 | int LinkKey; |
112 | }; | 112 | }; |
113 | }; | 113 | }; |
114 | 114 | ||
115 | // | 115 | // |
116 | // | 116 | // |
117 | // | 117 | // |
118 | // | 118 | // |
119 | // | 119 | // |
120 | 120 | ||
121 | OTSniffing::OTSniffing( QWidget * parent ) : OTSniffGUI( parent ) { | 121 | OTSniffing::OTSniffing( QWidget * parent ) : OTSniffGUI( parent ) { |
122 | 122 | ||
123 | OT = OTGateway::getOTGateway(); | 123 | OT = OTGateway::getOTGateway(); |
124 | HciDump = 0; | 124 | HciDump = 0; |
125 | } | 125 | } |
126 | 126 | ||
127 | OTSniffing::~OTSniffing() { | 127 | OTSniffing::~OTSniffing() { |
128 | SLOT_Trace( 0 ); | 128 | SLOT_Trace( 0 ); |
129 | } | 129 | } |
130 | 130 | ||
131 | void OTSniffing::SLOT_Trace( bool Run ) { | 131 | void OTSniffing::SLOT_Trace( bool Run ) { |
132 | 132 | ||
133 | if( ! Run ) { | 133 | if( ! Run ) { |
134 | if ( HciDump ) { | 134 | if ( HciDump ) { |
135 | HciDump->process().kill(); | 135 | HciDump->process().kill(); |
136 | delete HciDump; | 136 | delete HciDump; |
137 | } | 137 | } |
138 | HciDump = 0; | 138 | HciDump = 0; |
139 | return; | 139 | return; |
140 | } | 140 | } |
141 | 141 | ||
142 | HciDump = new MyProcess(); | 142 | HciDump = new MyProcess(); |
143 | QStringList SL; | 143 | QStringList SL; |
144 | 144 | ||
145 | SL << "/usr/sbin/hcidump"; | 145 | SL << "/usr/sbin/hcidump"; |
146 | switch( DataFormat_CB->currentItem() ) { | 146 | switch( DataFormat_CB->currentItem() ) { |
147 | case 0 : // Hex | 147 | case 0 : // Hex |
148 | SL << "-x"; | 148 | SL << "-x"; |
149 | break; | 149 | break; |
150 | case 1 : // Ascii | 150 | case 1 : // Ascii |
151 | SL << "-a"; | 151 | SL << "-a"; |
152 | break; | 152 | break; |
153 | case 2 : // both | 153 | case 2 : // both |
154 | SL << "-X"; | 154 | SL << "-X"; |
155 | break; | 155 | break; |
156 | } | 156 | } |
157 | 157 | ||
158 | SL << "-i"; | 158 | SL << "-i"; |
159 | SL << OT->scanWith()->devname(); | 159 | SL << OT->scanWith()->devname(); |
160 | 160 | ||
161 | connect( HciDump, | 161 | connect( HciDump, |
162 | SIGNAL( stdoutLine( const QString & ) ), | 162 | SIGNAL( stdoutLine( const QString & ) ), |
163 | this, | 163 | this, |
164 | SLOT( SLOT_Show( const QString & ) ) ); | 164 | SLOT( SLOT_Show( const QString & ) ) ); |
165 | 165 | ||
166 | connect( HciDump, | 166 | connect( HciDump, |
167 | SIGNAL(processExited(MyProcess*) ), | 167 | SIGNAL(processExited(MyProcess*) ), |
168 | this, | 168 | this, |
169 | SLOT( SLOT_ProcessExited(MyProcess*) ) ); | 169 | SLOT( SLOT_ProcessExited(MyProcess*) ) ); |
170 | 170 | ||
171 | HciDump->process() << SL; | 171 | HciDump->process() << SL; |
172 | 172 | ||
173 | if( ! HciDump->process().start( OProcess::DontCare, | 173 | if( ! HciDump->process().start( OProcess::DontCare, |
174 | OProcess::AllOutput ) | 174 | OProcess::AllOutput ) |
175 | ) { | 175 | ) { |
176 | QMessageBox::warning(0, | 176 | QMessageBox::warning(0, |
177 | tr("Run hcidump"), | 177 | tr("Run hcidump"), |
178 | tr("Cannot start %1").arg(SL.join(" ")) | 178 | tr("Cannot start %1").arg(SL.join(" ")) |
179 | ); | 179 | ); |
180 | delete HciDump; | 180 | delete HciDump; |
181 | HciDump = 0; | 181 | HciDump = 0; |
182 | } | 182 | } |
183 | 183 | ||
184 | } | 184 | } |
185 | 185 | ||
186 | void OTSniffing::SLOT_Show( const QString & S ) { | 186 | void OTSniffing::SLOT_Show( const QString & S ) { |
187 | printf( "%s\n", S.latin1() ); | 187 | printf( "%s\n", S.latin1() ); |
188 | Output_TV->setText( Output_TV->text() + S + "\n" ); | 188 | Output_TV->setText( Output_TV->text() + S + "\n" ); |
189 | 189 | ||
190 | QScrollBar *scroll = Output_TV->verticalScrollBar(); | 190 | QScrollBar *scroll = Output_TV->verticalScrollBar(); |
191 | scroll->setValue(scroll->maxValue()); | 191 | scroll->setValue(scroll->maxValue()); |
192 | //Output_LB->insertItem( S ); | 192 | //Output_LB->insertItem( S ); |
193 | //Output_LB->setCurrentItem( Output_LB->count()-1 ); | 193 | //Output_LB->setCurrentItem( Output_LB->count()-1 ); |
194 | //Output_LB->ensureCurrentVisible(); | 194 | //Output_LB->ensureCurrentVisible(); |
195 | } | 195 | } |
196 | 196 | ||
197 | void OTSniffing::SLOT_ProcessExited( MyProcess * ) { | 197 | void OTSniffing::SLOT_ProcessExited( MyProcess * ) { |
198 | printf( "Exited\n" ); | 198 | printf( "Exited\n" ); |
199 | delete HciDump; | 199 | delete HciDump; |
200 | HciDump = 0; | 200 | HciDump = 0; |
201 | } | 201 | } |
202 | 202 | ||
203 | void OTSniffing::SLOT_Save( void ) { | 203 | void OTSniffing::SLOT_Save( void ) { |
204 | QString S = OFileDialog::getSaveFileName( | 204 | QString S = OFileDialog::getSaveFileName( |
205 | OFileSelector::Extended, | 205 | OFileSelector::Extended, |
206 | QDir::home().path(), | 206 | QDir::home().path(), |
207 | QString::null, | 207 | QString::null, |
208 | MimeTypes(), | 208 | MimeTypes(), |
209 | this ); | 209 | this ); |
210 | 210 | ||
211 | if( ! S.isEmpty() ) { | 211 | if( ! S.isEmpty() ) { |
212 | QFile F( S ); | 212 | QFile F( S ); |
213 | if( ! F.open( IO_WriteOnly ) ) { | 213 | if( ! F.open( IO_WriteOnly ) ) { |
214 | QMessageBox::warning(0, | 214 | QMessageBox::warning(0, |
215 | tr("Save log"), | 215 | tr("Save log"), |
216 | tr("Cannot open %1").arg(S) | 216 | tr("Cannot open %1").arg(S) |
217 | ); | 217 | ); |
218 | return; | 218 | return; |
219 | } | 219 | } |
220 | QTextStream TS( &F ); | 220 | QTextStream TS( &F ); |
221 | TS << S << endl; | 221 | TS << S << endl; |
222 | } | 222 | } |
223 | } | 223 | } |
224 | 224 | ||
225 | void OTSniffing::SLOT_Load( void ) { | 225 | void OTSniffing::SLOT_Load( void ) { |
226 | QString S = OFileDialog::getOpenFileName( | 226 | QString S = OFileDialog::getOpenFileName( |
227 | OFileSelector::Extended, | 227 | OFileSelector::Extended, |
228 | QDir::home().path(), | 228 | QDir::home().path(), |
229 | QString::null, | 229 | QString::null, |
230 | MimeTypes(), | 230 | MimeTypes(), |
231 | this ); | 231 | this ); |
232 | 232 | ||
233 | if( ! S.isEmpty() ) { | 233 | if( ! S.isEmpty() ) { |
234 | QFile F( S ); | 234 | QFile F( S ); |
235 | if( ! F.open( IO_ReadOnly ) ) { | 235 | if( ! F.open( IO_ReadOnly ) ) { |
236 | QMessageBox::warning(0, | 236 | QMessageBox::warning(0, |
237 | tr("Save log"), | 237 | tr("Save log"), |
238 | tr("Cannot open %1").arg(S) | 238 | tr("Cannot open %1").arg(S) |
239 | ); | 239 | ); |
240 | return; | 240 | return; |
241 | } | 241 | } |
242 | QTextStream TS ( &F ); | 242 | QTextStream TS ( &F ); |
243 | SLOT_ClearLog(); | 243 | SLOT_ClearLog(); |
244 | S = TS.read(); | 244 | S = TS.read(); |
245 | // Output_LB->insertStringList( QStringList::split( "\n", S ) ); | 245 | // Output_LB->insertStringList( QStringList::split( "\n", S ) ); |
246 | Output_TV->setText( S ); | 246 | Output_TV->setText( S ); |
247 | } | 247 | } |
248 | } | 248 | } |
249 | 249 | ||
250 | void OTSniffing::SLOT_ClearLog( void ) { | 250 | void OTSniffing::SLOT_ClearLog( void ) { |
251 | // Output_LB->clear(); | 251 | // Output_LB->clear(); |
252 | Output_TV->setText( "" ); | 252 | Output_TV->setText( "" ); |
253 | } | 253 | } |
254 | 254 | ||
255 | // | 255 | // |
256 | // | 256 | // |
257 | // | 257 | // |
258 | // | 258 | // |
259 | // | 259 | // |
260 | 260 | ||
261 | OTPairing::OTPairing( QWidget * parent, OTIcons * _IC ) : | 261 | OTPairing::OTPairing( QWidget * parent, OTIcons * _IC ) : |
262 | OTPairingGUI( parent ) { | 262 | OTPairingGUI( parent ) { |
263 | 263 | ||
264 | OT = OTGateway::getOTGateway(); | 264 | OT = OTGateway::getOTGateway(); |
265 | Icons = (_IC ) ? _IC : new OTIcons(); | 265 | Icons = (_IC ) ? _IC : new OTIcons(); |
266 | MyIcons = (_IC == 0 ); | 266 | MyIcons = (_IC == 0 ); |
267 | 267 | ||
268 | // unpairing can only be done if bluetooth is disabled | 268 | // unpairing can only be done if bluetooth is disabled |
269 | Unpair_But->setEnabled( ! OT->isEnabled() ); | 269 | Unpair_But->setEnabled( ! OT->isEnabled() ); |
270 | if( ! OT->isEnabled() ) { | 270 | if( ! OT->isEnabled() ) { |
271 | Unpair_LBL->hide(); | 271 | Unpair_LBL->hide(); |
272 | } else { | 272 | } else { |
273 | Unpair_LBL->show(); | 273 | Unpair_LBL->show(); |
274 | } | 274 | } |
275 | 275 | ||
276 | // open linkkey file and load pairs | 276 | // open linkkey file and load pairs |
277 | LinkKeyArray Keys = OT->getLinkKeys(); | 277 | LinkKeyArray Keys = OT->getLinkKeys(); |
278 | LinkKeyLVI * it; | 278 | LinkKeyLVI * it; |
279 | OTPeer * P; | 279 | OTPeer * P; |
280 | OTDriver * D; | 280 | OTDriver * D; |
281 | 281 | ||
282 | for( unsigned int i = 0 ; | 282 | for( unsigned int i = 0 ; |
283 | i < Keys.count(); | 283 | i < Keys.count(); |
284 | i ++ ) { | 284 | i ++ ) { |
285 | 285 | ||
286 | it = new LinkKeyLVI( i, Pairs_LV ); | 286 | it = new LinkKeyLVI( i, Pairs_LV ); |
287 | 287 | ||
288 | P = 0; | 288 | P = 0; |
289 | D = OT->findDriver( Keys[i].from() ); | 289 | D = OT->findDriver( Keys[i].from() ); |
290 | 290 | ||
291 | if( D ) { | 291 | if( D ) { |
292 | it->setText( 0, D->devname() ); | 292 | it->setText( 0, D->devname() ); |
293 | 293 | ||
294 | // we are source | 294 | // we are source |
295 | P = OT->findPeer( Keys[i].to() ); | 295 | P = OT->findPeer( Keys[i].to() ); |
296 | 296 | ||
297 | if( P ) { | 297 | if( P ) { |
298 | // put name | 298 | // put name |
299 | it->setText( 1, P->name() ); | 299 | it->setText( 1, P->name() ); |
300 | } else { | 300 | } else { |
301 | // unknown | 301 | // unknown |
302 | it->setText( 1, Keys[i].to().toString() ); | 302 | it->setText( 1, Keys[i].to().toString() ); |
303 | } | 303 | } |
304 | 304 | ||
305 | // and put address as sub | 305 | // and put address as sub |
306 | QListViewItem * Sub = new QListViewItem( it ); | 306 | QListViewItem * Sub = new QListViewItem( it ); |
307 | Sub->setText( 0, D->address().toString() ); | 307 | Sub->setText( 0, D->address().toString() ); |
308 | Sub->setText( 1, Keys[i].to().toString() ); | 308 | Sub->setText( 1, Keys[i].to().toString() ); |
309 | } else { | 309 | } else { |
310 | // perhaps we are destination | 310 | // perhaps we are destination |
311 | D = OT->findDriver( Keys[i].to() ); | 311 | D = OT->findDriver( Keys[i].to() ); |
312 | 312 | ||
313 | if( D ) { | 313 | if( D ) { |
314 | it->setText( 1, D->devname() ); | 314 | it->setText( 1, D->devname() ); |
315 | 315 | ||
316 | // we are source | 316 | // we are source |
317 | P = OT->findPeer( Keys[i].from() ); | 317 | P = OT->findPeer( Keys[i].from() ); |
318 | 318 | ||
319 | if( P ) { | 319 | if( P ) { |
320 | // put name | 320 | // put name |
321 | it->setText( 0, P->name() ); | 321 | it->setText( 0, P->name() ); |
322 | } else { | 322 | } else { |
323 | // unknown | 323 | // unknown |
324 | it->setText( 0, Keys[i].from().toString() ); | 324 | it->setText( 0, Keys[i].from().toString() ); |
325 | } | 325 | } |
326 | 326 | ||
327 | // and put address as sub | 327 | // and put address as sub |
328 | QListViewItem * Sub = new QListViewItem( it ); | 328 | QListViewItem * Sub = new QListViewItem( it ); |
329 | Sub->setText( 0, Keys[i].from().toString() ); | 329 | Sub->setText( 0, Keys[i].from().toString() ); |
330 | Sub->setText( 1, D->address().toString() ); | 330 | Sub->setText( 1, D->address().toString() ); |
331 | } else { | 331 | } else { |
332 | // nor source nor destination -> unknown | 332 | // nor source nor destination -> unknown |
333 | it->setText( 0, Keys[i].from().toString() ); | 333 | it->setText( 0, Keys[i].from().toString() ); |
334 | it->setText( 1, Keys[i].to().toString() ); | 334 | it->setText( 1, Keys[i].to().toString() ); |
335 | } | 335 | } |
336 | } | 336 | } |
337 | } | 337 | } |
338 | } | 338 | } |
339 | 339 | ||
340 | 340 | ||
341 | OTPairing::~OTPairing() { | 341 | OTPairing::~OTPairing() { |
342 | if( MyIcons ) | 342 | if( MyIcons ) |
343 | delete Icons; | 343 | delete Icons; |
344 | OTGateway::releaseOTGateway(); | 344 | OTGateway::releaseOTGateway(); |
345 | } | 345 | } |
346 | 346 | ||
347 | void OTPairing::SLOT_Unpair( ) { | 347 | void OTPairing::SLOT_Unpair( ) { |
348 | // find selected pair | 348 | // find selected pair |
349 | 349 | ||
350 | QListViewItem * it = Pairs_LV->firstChild(); | 350 | QListViewItem * it = Pairs_LV->firstChild(); |
351 | while( it ) { | 351 | while( it ) { |
352 | if( it->isSelected() ) { | 352 | if( it->isSelected() ) { |
353 | // confirm ? | 353 | // confirm ? |
354 | if( QMessageBox::warning(0, | 354 | if( QMessageBox::warning(0, |
355 | tr("Break pairing"), | 355 | tr("Break pairing"), |
356 | tr("Sure ?"), | 356 | tr("Sure ?"), |
357 | tr("Yes, break"), | 357 | tr("Yes, break"), |
358 | tr("No, don't break") ) == 0 ) { | 358 | tr("No, don't break") ) == 0 ) { |
359 | LinkKeyLVI * KPIt = (LinkKeyLVI *)it; | 359 | LinkKeyLVI * KPIt = (LinkKeyLVI *)it; |
360 | // break | 360 | // break |
361 | OT->removeLinkKey( KPIt->index() ); | 361 | OT->removeLinkKey( KPIt->index() ); |
362 | delete KPIt; | 362 | delete KPIt; |
363 | } | 363 | } |
364 | return; | 364 | return; |
365 | } | 365 | } |
366 | it= it->nextSibling(); | 366 | it= it->nextSibling(); |
367 | } | 367 | } |
368 | } | 368 | } |
369 | 369 | ||
370 | // | 370 | // |
371 | // | 371 | // |
372 | // | 372 | // |
373 | // | 373 | // |
374 | // | 374 | // |
375 | 375 | ||
376 | OTScan::OTScan( QWidget * parent, OTIcons * _IC ) : | 376 | OTScan::OTScan( QWidget * parent, OTIcons * _IC ) : |
377 | OTScanGUI( parent ), Filter() { | 377 | OTScanGUI( parent ), Filter() { |
378 | 378 | ||
379 | OT = OTGateway::getOTGateway(); | 379 | OT = OTGateway::getOTGateway(); |
380 | Icons = (_IC ) ? _IC : new OTIcons(); | 380 | Icons = (_IC ) ? _IC : new OTIcons(); |
381 | MyIcons = (_IC == 0 ); | 381 | MyIcons = (_IC == 0 ); |
382 | DetectedPeers_LV->header()->hide(); | 382 | DetectedPeers_LV->header()->hide(); |
383 | Current = 0; | 383 | Current = 0; |
384 | SelectedPeer = 0; | 384 | SelectedPeer = 0; |
385 | SelectedChannel = 0; | 385 | SelectedChannel = 0; |
386 | 386 | ||
387 | StrengthTimer = new QTimer( this ); | 387 | StrengthTimer = new QTimer( this ); |
388 | connect( StrengthTimer, | 388 | connect( StrengthTimer, |
389 | SIGNAL( timeout()), | 389 | SIGNAL( timeout()), |
390 | this, | 390 | this, |
391 | SLOT( SLOT_UpdateStrength()) | 391 | SLOT( SLOT_UpdateStrength()) |
392 | ); | 392 | ); |
393 | 393 | ||
394 | connect( OT, | 394 | connect( OT, |
395 | SIGNAL( detectedPeer( OTPeer *, bool )), | 395 | SIGNAL( detectedPeer( OTPeer *, bool )), |
396 | this, | 396 | this, |
397 | SLOT( SLOT_NewPeer( OTPeer *, bool )) | 397 | SLOT( SLOT_NewPeer( OTPeer *, bool )) |
398 | ); | 398 | ); |
399 | connect( OT, | 399 | connect( OT, |
400 | SIGNAL( finishedDetecting()), | 400 | SIGNAL( finishedDetecting()), |
401 | this, | 401 | this, |
402 | SLOT( SLOT_FinishedDetecting()) | 402 | SLOT( SLOT_FinishedDetecting()) |
403 | ); | 403 | ); |
404 | 404 | ||
405 | // populate with peers we already know about | 405 | // populate with peers we already know about |
406 | const PeerVector & P = OT->peers(); | 406 | const PeerVector & P = OT->peers(); |
407 | for( unsigned int i = 0; | 407 | for( unsigned int i = 0; |
408 | i < P.count(); | 408 | i < P.count(); |
409 | i ++ ) { | 409 | i ++ ) { |
410 | SLOT_NewPeer( P[i], TRUE ); | 410 | SLOT_NewPeer( P[i], TRUE ); |
411 | } | 411 | } |
412 | 412 | ||
413 | // populate State fram | 413 | // populate State fram |
414 | { QHBoxLayout * H =new QHBoxLayout( State_Frm ); | 414 | { QHBoxLayout * H =new QHBoxLayout( State_Frm ); |
415 | 415 | ||
416 | Paired_Led = new OLedBox( green, State_Frm ); | 416 | Paired_Led = new OLedBox( green, State_Frm ); |
417 | QLabel * L1 = new QLabel( tr( "Paired" ), State_Frm ); | 417 | QLabel * L1 = new QLabel( tr( "Paired" ), State_Frm ); |
418 | 418 | ||
419 | H->addWidget( Paired_Led ); | 419 | H->addWidget( Paired_Led ); |
420 | H->addWidget( L1 ); | 420 | H->addWidget( L1 ); |
421 | H->addStretch( 1 ); | 421 | H->addStretch( 1 ); |
422 | } | 422 | } |
423 | } | 423 | } |
424 | 424 | ||
425 | OTScan::~OTScan() { | 425 | OTScan::~OTScan() { |
426 | if( MyIcons ) | 426 | if( MyIcons ) |
427 | delete Icons; | 427 | delete Icons; |
428 | OTGateway::releaseOTGateway(); | 428 | OTGateway::releaseOTGateway(); |
429 | 429 | ||
430 | // send all peers that we do not care about states | 430 | // send all peers that we do not care about states |
431 | QListViewItem * Lit = DetectedPeers_LV->firstChild(); | 431 | QListViewItem * Lit = DetectedPeers_LV->firstChild(); |
432 | while( Lit ) { | 432 | while( Lit ) { |
433 | ((PeerLVI *)Lit)->peer()->stopFindingOutState( ); | 433 | ((PeerLVI *)Lit)->peer()->stopFindingOutState( ); |
434 | Lit = Lit->nextSibling(); | 434 | Lit = Lit->nextSibling(); |
435 | } | 435 | } |
436 | } | 436 | } |
437 | 437 | ||
438 | // static scan dialog function | 438 | // static scan dialog function |
439 | int OTScan::getDevice( OTPeer *& Peer, | 439 | int OTScan::getDevice( OTPeer *& Peer, |
440 | int & Channel, | 440 | int & Channel, |
441 | OTGateway * OT, | 441 | OTGateway * OT, |
442 | const UUIDVector & Filter, | 442 | const UUIDVector & Filter, |
443 | QWidget* Parent ) { | 443 | QWidget* Parent ) { |
444 | bool IsUp = 0; | 444 | bool IsUp = 0; |
445 | unsigned int i; | 445 | unsigned int i; |
446 | 446 | ||
447 | // check if bluetooth is up | 447 | // check if bluetooth is up |
448 | OTDriverList & DL = OT->getDriverList(); | 448 | OTDriverList & DL = OT->getDriverList(); |
449 | for( i = 0; | 449 | for( i = 0; |
450 | i < DL.count(); | 450 | i < DL.count(); |
451 | i ++ ) { | 451 | i ++ ) { |
452 | if( DL[i]->isUp() ) { | 452 | if( DL[i]->isUp() ) { |
453 | // one device that is up found | 453 | // one device that is up found |
454 | IsUp = 1; | 454 | IsUp = 1; |
455 | break; | 455 | break; |
456 | } | 456 | } |
457 | } | 457 | } |
458 | 458 | ||
459 | // use this driver | 459 | // use this driver |
460 | OT->setScanWith( OT->driver(i) ); | 460 | OT->setScanWith( OT->driver(i) ); |
461 | 461 | ||
462 | // create dialog | 462 | // create dialog |
463 | QDialog * Dlg = new QDialog( Parent, 0, TRUE ); | 463 | QDialog * Dlg = new QDialog( Parent, 0, TRUE ); |
464 | QVBoxLayout * V = new QVBoxLayout( Dlg ); | 464 | QVBoxLayout * V = new QVBoxLayout( Dlg ); |
465 | OTScan * Scn = new OTScan( Dlg ); | 465 | OTScan * Scn = new OTScan( Dlg ); |
466 | 466 | ||
467 | connect( Scn, | 467 | connect( Scn, |
468 | SIGNAL( selected() ), | 468 | SIGNAL( selected() ), |
469 | Dlg, | 469 | Dlg, |
470 | SLOT( accept() ) | 470 | SLOT( accept() ) |
471 | ); | 471 | ); |
472 | 472 | ||
473 | if( Filter ) { | 473 | if( Filter ) { |
474 | Scn->setScanFilter( Filter ); | 474 | Scn->setScanFilter( Filter ); |
475 | } | 475 | } |
476 | 476 | ||
477 | V->addWidget( Scn ); | 477 | V->addWidget( Scn ); |
478 | Dlg->setCaption( tr("Scan Neighbourhood" ) ); | 478 | Dlg->setCaption( tr("Scan Neighbourhood" ) ); |
479 | Dlg->showMaximized(); | 479 | Dlg->showMaximized(); |
480 | int rv = Dlg->exec(); | 480 | int rv = Dlg->exec(); |
481 | 481 | ||
482 | if( rv == QDialog::Accepted ) { | 482 | if( rv == QDialog::Accepted ) { |
483 | // get peer | 483 | // get peer |
484 | Peer = Scn->selectedPeer(); | 484 | Peer = Scn->selectedPeer(); |
485 | if( Peer == 0 ) { | 485 | if( Peer == 0 ) { |
486 | // no peer selected | 486 | // no peer selected |
487 | rv = QDialog::Rejected; | 487 | rv = QDialog::Rejected; |
488 | } else { | 488 | } else { |
489 | Channel = Scn->selectedChannel(); | 489 | Channel = Scn->selectedChannel(); |
490 | } | 490 | } |
491 | } | 491 | } |
492 | 492 | ||
493 | delete Dlg; | 493 | delete Dlg; |
494 | 494 | ||
495 | return rv; | 495 | return rv; |
496 | } | 496 | } |
497 | 497 | ||
498 | void OTScan::setScanFilter( const UUIDVector & V ) { | 498 | void OTScan::setScanFilter( const UUIDVector & V ) { |
499 | Filter = V; | 499 | Filter = V; |
500 | } | 500 | } |
501 | 501 | ||
502 | void OTScan::resetScanFilter( void ) { | 502 | void OTScan::resetScanFilter( void ) { |
503 | Filter.truncate(0); | 503 | Filter.truncate(0); |
504 | } | 504 | } |
505 | 505 | ||
506 | void OTScan::SLOT_DoScan( bool DoIt ) { | 506 | void OTScan::SLOT_DoScan( bool DoIt ) { |
507 | if( DoIt ) { | 507 | if( DoIt ) { |
508 | OT->scanNeighbourhood(); | 508 | OT->scanNeighbourhood(); |
509 | } else { | 509 | } else { |
510 | OT->stopScanOfNeighbourhood(); | 510 | OT->stopScanOfNeighbourhood(); |
511 | } | 511 | } |
512 | 512 | ||
513 | scanMode( DoIt ); | 513 | scanMode( DoIt ); |
514 | } | 514 | } |
515 | 515 | ||
516 | // double clicked on a device | 516 | // double clicked on a device |
517 | void OTScan::SLOT_Selected( QListViewItem * it ) { | 517 | void OTScan::SLOT_Selected( QListViewItem * it ) { |
518 | if( ! it ) | 518 | if( ! it ) |
519 | return; | 519 | return; |
520 | 520 | ||
521 | if( Filter.count() > 0 ) { | 521 | if( Filter.count() > 0 ) { |
522 | // filter on service | 522 | // filter on service |
523 | if( it->depth() == 0 ) { | 523 | if( it->depth() == 0 ) { |
524 | // select a service and not a device | 524 | // select a service and not a device |
525 | return; | 525 | return; |
526 | } | 526 | } |
527 | 527 | ||
528 | // store result | 528 | // store result |
529 | SelectedPeer = ((PeerLVI *)it->parent())->peer(); | 529 | SelectedPeer = ((PeerLVI *)it->parent())->peer(); |
530 | SelectedChannel = ((ChannelLVI *)it)->channel(); | 530 | SelectedChannel = ((ChannelLVI *)it)->channel(); |
531 | } else { | 531 | } else { |
532 | // click on device | 532 | // click on device |
533 | if( it->depth() != 0 ) { | 533 | if( it->depth() != 0 ) { |
534 | return; | 534 | return; |
535 | } | 535 | } |
536 | 536 | ||
537 | SelectedPeer = ((PeerLVI *)it)->peer(); | 537 | SelectedPeer = ((PeerLVI *)it)->peer(); |
538 | SelectedChannel = 0; | 538 | SelectedChannel = 0; |
539 | } | 539 | } |
540 | owarn << "Selected " << SelectedPeer->address().toString() << | 540 | odebug << "Selected " << SelectedPeer->address().toString() << |
541 | " Channel " << SelectedChannel << oendl; | 541 | " Channel " << SelectedChannel << oendl; |
542 | emit selected(); | 542 | emit selected(); |
543 | } | 543 | } |
544 | 544 | ||
545 | void OTScan::SLOT_FinishedDetecting( ) { | 545 | void OTScan::SLOT_FinishedDetecting( ) { |
546 | scanMode( false ); | 546 | scanMode( false ); |
547 | } | 547 | } |
548 | 548 | ||
549 | void OTScan::SLOT_CleanupOld( ) { | 549 | void OTScan::SLOT_CleanupOld( ) { |
550 | 550 | ||
551 | // iterate over all peers and find those that | 551 | // iterate over all peers and find those that |
552 | // are down and have no pairing info | 552 | // are down and have no pairing info |
553 | OTPeer * TheP; | 553 | OTPeer * TheP; |
554 | const LinkKeyArray & Keys = OT->getLinkKeys(); | 554 | const LinkKeyArray & Keys = OT->getLinkKeys(); |
555 | 555 | ||
556 | QListViewItem * Lit = DetectedPeers_LV->firstChild(); | 556 | QListViewItem * Lit = DetectedPeers_LV->firstChild(); |
557 | while( Lit ) { | 557 | while( Lit ) { |
558 | TheP = ((PeerLVI *)Lit)->peer(); | 558 | TheP = ((PeerLVI *)Lit)->peer(); |
559 | if( TheP->state() == OTPeer::Peer_Down ) { | 559 | if( TheP->state() == OTPeer::Peer_Down ) { |
560 | unsigned int k; | 560 | unsigned int k; |
561 | 561 | ||
562 | // what about linkkeys ? | 562 | // what about linkkeys ? |
563 | for( k = 0; k < Keys.count(); k ++ ) { | 563 | for( k = 0; k < Keys.count(); k ++ ) { |
564 | if( TheP->address() == Keys[k].to() || | 564 | if( TheP->address() == Keys[k].to() || |
565 | TheP->address() == Keys[k].from() | 565 | TheP->address() == Keys[k].from() |
566 | ) { | 566 | ) { |
567 | // part of linkkey | 567 | // part of linkkey |
568 | owarn << "LINKKEY " << TheP->address().toString() << oendl; | 568 | odebug << "LINKKEY " << TheP->address().toString() << oendl; |
569 | break; | 569 | break; |
570 | } | 570 | } |
571 | } | 571 | } |
572 | 572 | ||
573 | if( k == Keys.count() ) { | 573 | if( k == Keys.count() ) { |
574 | owarn << "RM LINKKEY " << TheP->address().toString() << oendl; | 574 | odebug << "RM LINKKEY " << TheP->address().toString() << oendl; |
575 | // not found -> remember to remove this peer | 575 | // not found -> remember to remove this peer |
576 | QListViewItem * Nit; | 576 | QListViewItem * Nit; |
577 | OT->removePeer( TheP ); | 577 | OT->removePeer( TheP ); |
578 | Nit = Lit->nextSibling(); | 578 | Nit = Lit->nextSibling(); |
579 | delete Lit; | 579 | delete Lit; |
580 | Lit = Nit; | 580 | Lit = Nit; |
581 | continue; | 581 | continue; |
582 | } | 582 | } |
583 | } else { | 583 | } else { |
584 | owarn << "NODOWN " << TheP->address().toString() << oendl; | 584 | odebug << "NODOWN " << TheP->address().toString() << oendl; |
585 | } | 585 | } |
586 | 586 | ||
587 | Lit = Lit->nextSibling(); | 587 | Lit = Lit->nextSibling(); |
588 | } | 588 | } |
589 | } | 589 | } |
590 | 590 | ||
591 | void OTScan::SLOT_NewPeer( OTPeer * P, bool IsNew ){ | 591 | void OTScan::SLOT_NewPeer( OTPeer * P, bool IsNew ){ |
592 | PeerLVI * it = 0; | 592 | PeerLVI * it = 0; |
593 | 593 | ||
594 | if( IsNew ) { | 594 | if( IsNew ) { |
595 | it = new PeerLVI( P, DetectedPeers_LV ); | 595 | it = new PeerLVI( P, DetectedPeers_LV ); |
596 | } else { | 596 | } else { |
597 | // find peer in table | 597 | // find peer in table |
598 | QListViewItem * Lit = DetectedPeers_LV->firstChild(); | 598 | QListViewItem * Lit = DetectedPeers_LV->firstChild(); |
599 | while( Lit ) { | 599 | while( Lit ) { |
600 | if( ((PeerLVI *)Lit)->peer() == P ) { | 600 | if( ((PeerLVI *)Lit)->peer() == P ) { |
601 | // this item | 601 | // this item |
602 | it = (PeerLVI *)Lit; | 602 | it = (PeerLVI *)Lit; |
603 | break; | 603 | break; |
604 | } | 604 | } |
605 | Lit = Lit->nextSibling(); | 605 | Lit = Lit->nextSibling(); |
606 | } | 606 | } |
607 | 607 | ||
608 | if( ! it ) { | 608 | if( ! it ) { |
609 | owarn << "Should not occur" << oendl; | 609 | odebug << "Should not occur" << oendl; |
610 | return; | 610 | return; |
611 | } | 611 | } |
612 | } | 612 | } |
613 | 613 | ||
614 | // update/show info | 614 | // update/show info |
615 | it->setText( 0, P->name() ); | 615 | it->setText( 0, P->name() ); |
616 | it->setPixmap(0, Icons->deviceIcon( | 616 | it->setPixmap(0, Icons->deviceIcon( |
617 | OT->deviceTypeToName( P->deviceClass() ) ) ); | 617 | OT->deviceTypeToName( P->deviceClass() ) ) ); |
618 | 618 | ||
619 | // tell peer to report its state async | 619 | // tell peer to report its state async |
620 | connect( P, | 620 | connect( P, |
621 | SIGNAL( peerStateReport( OTPeer *)), | 621 | SIGNAL( peerStateReport( OTPeer *)), |
622 | this, | 622 | this, |
623 | SLOT( SLOT_PeerState( OTPeer *)) | 623 | SLOT( SLOT_PeerState( OTPeer *)) |
624 | ); | 624 | ); |
625 | 625 | ||
626 | if( IsNew ) { | 626 | if( IsNew ) { |
627 | // find state | 627 | // find state |
628 | refreshState( (PeerLVI *)it, 1 ); | 628 | refreshState( (PeerLVI *)it, 1 ); |
629 | } else { | 629 | } else { |
630 | // update staet | 630 | // update staet |
631 | SLOT_PeerState( P ); | 631 | SLOT_PeerState( P ); |
632 | } | 632 | } |
633 | } | 633 | } |
634 | 634 | ||
635 | void OTScan::SLOT_PeerState( OTPeer * P ) { | 635 | void OTScan::SLOT_PeerState( OTPeer * P ) { |
636 | PeerLVI * it = (PeerLVI *)DetectedPeers_LV->firstChild(); | 636 | PeerLVI * it = (PeerLVI *)DetectedPeers_LV->firstChild(); |
637 | while( it ) { | 637 | while( it ) { |
638 | if( it->peer() == P ) { | 638 | if( it->peer() == P ) { |
639 | break; | 639 | break; |
640 | } | 640 | } |
641 | it = (PeerLVI * )it->nextSibling(); | 641 | it = (PeerLVI * )it->nextSibling(); |
642 | } | 642 | } |
643 | 643 | ||
644 | if( ! it ) | 644 | if( ! it ) |
645 | return; | 645 | return; |
646 | 646 | ||
647 | switch( P->state() ) { | 647 | switch( P->state() ) { |
648 | case OTPeer::Peer_Unknown : | 648 | case OTPeer::Peer_Unknown : |
649 | case OTPeer::Peer_Down : | 649 | case OTPeer::Peer_Down : |
650 | it->setPixmap( 1, 0 ); | 650 | it->setPixmap( 1, 0 ); |
651 | break; | 651 | break; |
652 | case OTPeer::Peer_Up : | 652 | case OTPeer::Peer_Up : |
653 | it->setPixmap( 1, Icons->loadPixmap( | 653 | it->setPixmap( 1, Icons->loadPixmap( |
654 | ( P->connectedTo() ) ? "connected" : "notconnected" ) ); | 654 | ( P->connectedTo() ) ? "connected" : "notconnected" ) ); |
655 | if( it == Current && ! StrengthTimer->isActive() ) { | 655 | if( it == Current && ! StrengthTimer->isActive() ) { |
656 | // start showing strength | 656 | // start showing strength |
657 | StrengthTimer->start( 1000, FALSE ); | 657 | StrengthTimer->start( 1000, FALSE ); |
658 | SLOT_UpdateStrength(); | 658 | SLOT_UpdateStrength(); |
659 | } | 659 | } |
660 | break; | 660 | break; |
661 | } | 661 | } |
662 | } | 662 | } |
663 | 663 | ||
664 | void OTScan::SLOT_RefreshState( void ) { | 664 | void OTScan::SLOT_RefreshState( void ) { |
665 | 665 | ||
666 | QListViewItem * it = DetectedPeers_LV->firstChild(); | 666 | QListViewItem * it = DetectedPeers_LV->firstChild(); |
667 | while( it ) { | 667 | while( it ) { |
668 | if( it->isSelected() ) { | 668 | if( it->isSelected() ) { |
669 | break; | 669 | break; |
670 | } | 670 | } |
671 | it = it->nextSibling(); | 671 | it = it->nextSibling(); |
672 | } | 672 | } |
673 | 673 | ||
674 | if( ! it ) | 674 | if( ! it ) |
675 | return; | 675 | return; |
676 | 676 | ||
677 | refreshState( (PeerLVI *)it, 1 ); | 677 | refreshState( (PeerLVI *)it, 1 ); |
678 | } | 678 | } |
679 | 679 | ||
680 | void OTScan::refreshState( PeerLVI * it, bool Force ) { | 680 | void OTScan::refreshState( PeerLVI * it, bool Force ) { |
681 | it->setPixmap( 1, Icons->loadPixmap( "find" ) ); | 681 | it->setPixmap( 1, Icons->loadPixmap( "find" ) ); |
682 | it->peer()->findOutState( 30, Force ); | 682 | it->peer()->findOutState( 30, Force ); |
683 | } | 683 | } |
684 | 684 | ||
685 | void OTScan::SLOT_Show( QListViewItem * it ) { | 685 | void OTScan::SLOT_Show( QListViewItem * it ) { |
686 | 686 | ||
687 | if( ! it || it->depth() > 0 ) | 687 | if( ! it || it->depth() > 0 ) |
688 | return; | 688 | return; |
689 | 689 | ||
690 | QString S; | 690 | QString S; |
691 | 691 | ||
692 | Current = (PeerLVI *)it; | 692 | Current = (PeerLVI *)it; |
693 | 693 | ||
694 | Strength_PB->setProgress( 0 ); // reset | 694 | Strength_PB->setProgress( 0 ); // reset |
695 | Address_LBL->setText( Current->peer()->address().toString() ); | 695 | Address_LBL->setText( Current->peer()->address().toString() ); |
696 | Peer_GB->setTitle( Current->peer()->name() ); | 696 | Peer_GB->setTitle( Current->peer()->name() ); |
697 | 697 | ||
698 | const LinkKeyArray & Keys = OT->getLinkKeys(); | 698 | const LinkKeyArray & Keys = OT->getLinkKeys(); |
699 | 699 | ||
700 | Paired_Led->setOn( FALSE ); | 700 | Paired_Led->setOn( FALSE ); |
701 | for( unsigned int i = 0; | 701 | for( unsigned int i = 0; |
702 | i < Keys.count(); | 702 | i < Keys.count(); |
703 | i ++ ) { | 703 | i ++ ) { |
704 | if( Current->peer()->address() == Keys[i].to() ) { | 704 | if( Current->peer()->address() == Keys[i].to() ) { |
705 | Paired_Led->setOn( TRUE ); | 705 | Paired_Led->setOn( TRUE ); |
706 | break; | 706 | break; |
707 | } | 707 | } |
708 | } | 708 | } |
709 | 709 | ||
710 | if( Current->peer()->state() == OTPeer::Peer_Up ) { | 710 | if( Current->peer()->state() == OTPeer::Peer_Up ) { |
711 | RefreshServices_But->setEnabled( TRUE ); | 711 | RefreshServices_But->setEnabled( TRUE ); |
712 | StrengthTimer->start( 1000, FALSE ); | 712 | StrengthTimer->start( 1000, FALSE ); |
713 | SLOT_UpdateStrength(); | 713 | SLOT_UpdateStrength(); |
714 | } else { | 714 | } else { |
715 | RefreshServices_But->setEnabled( FALSE ); | 715 | RefreshServices_But->setEnabled( FALSE ); |
716 | } | 716 | } |
717 | 717 | ||
718 | } | 718 | } |
719 | 719 | ||
720 | void OTScan::SLOT_UpdateStrength( void ) { | 720 | void OTScan::SLOT_UpdateStrength( void ) { |
721 | OTDriver * D = Current->peer()->connectedTo(); | 721 | OTDriver * D = Current->peer()->connectedTo(); |
722 | 722 | ||
723 | if( D ) { | 723 | if( D ) { |
724 | long Q = D->getLinkQuality( Current->peer()->address() ); | 724 | long Q = D->getLinkQuality( Current->peer()->address() ); |
725 | Strength_PB->setProgress( Q ); | 725 | Strength_PB->setProgress( Q ); |
726 | if( ! Q ) { | 726 | if( ! Q ) { |
727 | // no quality | 727 | // no quality |
728 | Strength_PB->setEnabled( TRUE ); | 728 | Strength_PB->setEnabled( TRUE ); |
729 | StrengthTimer->stop(); | 729 | StrengthTimer->stop(); |
730 | } | 730 | } |
731 | } else { | 731 | } else { |
732 | Strength_PB->setEnabled( FALSE ); | 732 | Strength_PB->setEnabled( FALSE ); |
733 | Strength_PB->setProgress( 0 ); | 733 | Strength_PB->setProgress( 0 ); |
734 | // no point in continuing | 734 | // no point in continuing |
735 | StrengthTimer->stop(); | 735 | StrengthTimer->stop(); |
736 | } | 736 | } |
737 | } | 737 | } |
738 | 738 | ||
739 | void OTScan::SLOT_RefreshServices( void ) { | 739 | void OTScan::SLOT_RefreshServices( void ) { |
740 | 740 | ||
741 | QListViewItem * it = DetectedPeers_LV->firstChild(); | 741 | QListViewItem * it = DetectedPeers_LV->firstChild(); |
742 | while( it ) { | 742 | while( it ) { |
743 | if( it->isSelected() ) { | 743 | if( it->isSelected() ) { |
744 | break; | 744 | break; |
745 | } | 745 | } |
746 | it = it->nextSibling(); | 746 | it = it->nextSibling(); |
747 | } | 747 | } |
748 | 748 | ||
749 | if( ! it ) | 749 | if( ! it ) |
750 | return; | 750 | return; |
751 | 751 | ||
752 | QString S; | 752 | QString S; |
753 | PeerLVI * PI = (PeerLVI *)it; | 753 | PeerLVI * PI = (PeerLVI *)it; |
754 | 754 | ||
755 | scanMode( true ); | 755 | scanMode( true ); |
756 | qApp->processEvents(0); | 756 | qApp->processEvents(0); |
757 | 757 | ||
758 | ServiceVector & V = PI->peer()->services(); | 758 | ServiceVector & V = PI->peer()->services(); |
759 | 759 | ||
760 | while( PI->firstChild() ) { | 760 | while( PI->firstChild() ) { |
761 | // remove children | 761 | // remove children |
762 | delete PI->firstChild(); | 762 | delete PI->firstChild(); |
763 | } | 763 | } |
764 | 764 | ||
765 | for( unsigned int i = 0 ; | 765 | for( unsigned int i = 0 ; |
766 | i < V.count(); | 766 | i < V.count(); |
767 | i ++ ) { | 767 | i ++ ) { |
768 | QString S; | 768 | QString S; |
769 | S = V[i]->name(); | 769 | S = V[i]->name(); |
770 | 770 | ||
771 | if( S.isEmpty() ) { | 771 | if( S.isEmpty() ) { |
772 | continue; | 772 | continue; |
773 | } | 773 | } |
774 | 774 | ||
775 | { QListViewItem * SIt; | 775 | { QListViewItem * SIt; |
776 | UUIDVector UIDV; | 776 | UUIDVector UIDV; |
777 | QPixmap Pm; | 777 | QPixmap Pm; |
778 | bool Done = 0; | 778 | bool Done = 0; |
779 | bool R; | 779 | bool R; |
780 | short ID; | 780 | short ID; |
781 | 781 | ||
782 | SIt = 0; | 782 | SIt = 0; |
783 | 783 | ||
784 | UIDV = V[i]->classIDList(); | 784 | UIDV = V[i]->classIDList(); |
785 | // first all UUID ! 1200 12ff (Genericprofiles) | 785 | // first all UUID ! 1200 12ff (Genericprofiles) |
786 | for( unsigned int j = 0; | 786 | for( unsigned int j = 0; |
787 | j < UIDV.count(); | 787 | j < UIDV.count(); |
788 | j ++ ) { | 788 | j ++ ) { |
789 | 789 | ||
790 | if( Filter.count() ) { | 790 | if( Filter.count() ) { |
791 | bool FilterOut = 1; | 791 | bool FilterOut = 1; |
792 | // filter out if not in list | 792 | // filter out if not in list |
793 | for( unsigned int ff = 0; | 793 | for( unsigned int ff = 0; |
794 | ff < Filter.count(); | 794 | ff < Filter.count(); |
795 | ff ++ ) { | 795 | ff ++ ) { |
796 | if( UIDV[j] == Filter[ff] ) { | 796 | if( UIDV[j] == Filter[ff] ) { |
797 | FilterOut = 0; | 797 | FilterOut = 0; |
798 | break; | 798 | break; |
799 | } | 799 | } |
800 | } | 800 | } |
801 | 801 | ||
802 | if( FilterOut ) { | 802 | if( FilterOut ) { |
803 | // not in filter list | 803 | // not in filter list |
804 | continue; | 804 | continue; |
805 | } | 805 | } |
806 | } // else show | 806 | } // else show |
807 | 807 | ||
808 | ID = UIDV[j].toShort(); | 808 | ID = UIDV[j].toShort(); |
809 | if( ID < 0x1200 || ID > 0x12ff ) { | 809 | if( ID < 0x1200 || ID > 0x12ff ) { |
810 | // use this profile | 810 | // use this profile |
811 | if( R ) { | 811 | if( R ) { |
812 | unsigned int ch; | 812 | unsigned int ch; |
813 | bool has; | 813 | bool has; |
814 | has = V[i]->rfcommChannel( ch ); | 814 | has = V[i]->rfcommChannel( ch ); |
815 | SIt = new ChannelLVI( (has) ? (int)ch : -1 , PI ); | 815 | SIt = new ChannelLVI( (has) ? (int)ch : -1 , PI ); |
816 | SIt->setText(0, V[i]->name() ); | 816 | SIt->setText(0, V[i]->name() ); |
817 | 817 | ||
818 | Pm = Icons->serviceIcon( ID, R ); | 818 | Pm = Icons->serviceIcon( ID, R ); |
819 | SIt->setPixmap(0, Pm ); | 819 | SIt->setPixmap(0, Pm ); |
820 | Done = 1; | 820 | Done = 1; |
821 | break; | 821 | break; |
822 | } | 822 | } |
823 | } | 823 | } |
824 | } | 824 | } |
825 | 825 | ||
826 | if( ! Done ) { | 826 | if( ! Done ) { |
827 | // check other range too | 827 | // check other range too |
828 | for( unsigned int j = 0; | 828 | for( unsigned int j = 0; |
829 | j < UIDV.count(); | 829 | j < UIDV.count(); |
830 | j ++ ) { | 830 | j ++ ) { |
831 | 831 | ||
832 | if( Filter.count() ) { | 832 | if( Filter.count() ) { |
833 | bool FilterOut = 1; | 833 | bool FilterOut = 1; |
834 | // filter out if not in list | 834 | // filter out if not in list |
835 | for( unsigned int ff = 0; | 835 | for( unsigned int ff = 0; |
836 | ff < Filter.count(); | 836 | ff < Filter.count(); |
837 | ff ++ ) { | 837 | ff ++ ) { |
838 | if( UIDV[j] == Filter[ff] ) { | 838 | if( UIDV[j] == Filter[ff] ) { |
839 | FilterOut = 0; | 839 | FilterOut = 0; |
840 | break; | 840 | break; |
841 | } | 841 | } |
842 | } | 842 | } |
843 | 843 | ||
844 | if( FilterOut ) { | 844 | if( FilterOut ) { |
845 | // not in filter list | 845 | // not in filter list |
846 | continue; | 846 | continue; |
847 | } | 847 | } |
848 | } // else show | 848 | } // else show |
849 | 849 | ||
850 | ID = UIDV[j].toShort(); | 850 | ID = UIDV[j].toShort(); |
851 | if( ID >= 0x1200 && ID <= 0x12ff ) { | 851 | if( ID >= 0x1200 && ID <= 0x12ff ) { |
852 | // use this profile | 852 | // use this profile |
853 | unsigned int ch; | 853 | unsigned int ch; |
854 | bool has; | 854 | bool has; |
855 | has = V[i]->rfcommChannel( ch ); | 855 | has = V[i]->rfcommChannel( ch ); |
856 | SIt = new ChannelLVI( (has) ? (int)ch : -1 , PI ); | 856 | SIt = new ChannelLVI( (has) ? (int)ch : -1 , PI ); |
857 | SIt->setText(0, V[i]->name() ); | 857 | SIt->setText(0, V[i]->name() ); |
858 | 858 | ||
859 | Pm = Icons->serviceIcon( ID, R ); | 859 | Pm = Icons->serviceIcon( ID, R ); |
860 | SIt->setPixmap(0, Pm ); | 860 | SIt->setPixmap(0, Pm ); |
861 | 861 | ||
862 | break; | 862 | break; |
863 | } | 863 | } |
864 | } | 864 | } |
865 | } | 865 | } |
866 | 866 | ||
867 | } | 867 | } |
868 | } | 868 | } |
869 | 869 | ||
870 | scanMode( false ); | 870 | scanMode( false ); |
871 | } | 871 | } |
872 | 872 | ||
873 | void OTScan::scanMode( bool M ) { | 873 | void OTScan::scanMode( bool M ) { |
874 | // avoid infinite loop because it triggers DoScan | 874 | // avoid infinite loop because it triggers DoScan |
875 | Detect_But->blockSignals( TRUE ); | 875 | Detect_But->blockSignals( TRUE ); |
876 | Detect_But->setOn( M ); | 876 | Detect_But->setOn( M ); |
877 | Detect_But->setText( (M) ? tr("Scanning") : tr("Scan") ); | 877 | Detect_But->setText( (M) ? tr("Scanning") : tr("Scan") ); |
878 | Detect_But->blockSignals( FALSE ); | 878 | Detect_But->blockSignals( FALSE ); |
879 | } | 879 | } |
880 | 880 | ||
881 | // | 881 | // |
882 | // | 882 | // |
883 | // | 883 | // |
884 | // | 884 | // |
885 | // | 885 | // |
886 | 886 | ||
887 | OTManage::OTManage( QWidget * parent, OTIcons * _IC ) : | 887 | OTManage::OTManage( QWidget * parent, OTIcons * _IC ) : |
888 | OTManageGUI( parent ) { | 888 | OTManageGUI( parent ) { |
889 | 889 | ||
890 | OT = OTGateway::getOTGateway(); | 890 | OT = OTGateway::getOTGateway(); |
891 | 891 | ||
892 | Icons = (_IC ) ? _IC : new OTIcons(); | 892 | Icons = (_IC ) ? _IC : new OTIcons(); |
893 | MyIcons = (_IC == 0 ); | 893 | MyIcons = (_IC == 0 ); |
894 | AllDrivers_LV->setSorting(-1); | 894 | AllDrivers_LV->setSorting(-1); |
895 | 895 | ||
896 | connect( OT, | 896 | connect( OT, |
897 | SIGNAL( driverListChanged() ), | 897 | SIGNAL( driverListChanged() ), |
898 | this, | 898 | this, |
899 | SLOT( SLOT_DriverListChanged() ) | 899 | SLOT( SLOT_DriverListChanged() ) |
900 | ); | 900 | ); |
901 | connect( OT, | 901 | connect( OT, |
902 | SIGNAL( stateChange( OTDriver *, bool ) ), | 902 | SIGNAL( stateChange( OTDriver *, bool ) ), |
903 | this, | 903 | this, |
904 | SLOT( SLOT_StateChange( OTDriver *, bool ) ) | 904 | SLOT( SLOT_StateChange( OTDriver *, bool ) ) |
905 | ); | 905 | ); |
906 | 906 | ||
907 | SLOT_DriverListChanged(); | 907 | SLOT_DriverListChanged(); |
908 | 908 | ||
909 | AllDrivers_LV->header()->hide(); | 909 | AllDrivers_LV->header()->hide(); |
910 | } | 910 | } |
911 | 911 | ||
912 | OTManage::~OTManage() { | 912 | OTManage::~OTManage() { |
913 | if( MyIcons ) | 913 | if( MyIcons ) |
914 | delete Icons; | 914 | delete Icons; |
915 | OTGateway::releaseOTGateway(); | 915 | OTGateway::releaseOTGateway(); |
916 | } | 916 | } |
917 | 917 | ||
918 | void OTManage::SLOT_ShowDriver( QListViewItem * It ) { | 918 | void OTManage::SLOT_ShowDriver( QListViewItem * It ) { |
919 | if( It == 0 || It->depth() > 0 ) | 919 | if( It == 0 || It->depth() > 0 ) |
920 | // not toplevel | 920 | // not toplevel |
921 | return; | 921 | return; |
922 | 922 | ||
923 | DriverLVI * it = (DriverLVI *) It; | 923 | DriverLVI * it = (DriverLVI *) It; |
924 | DriverIsUp_CB->setChecked( it->driver()->isUp() ); | 924 | DriverIsUp_CB->setChecked( it->driver()->isUp() ); |
925 | } | 925 | } |
926 | 926 | ||
927 | void OTManage::SLOT_UpDriver( bool Up ) { | 927 | void OTManage::SLOT_UpDriver( bool Up ) { |
928 | QListViewItem * it = AllDrivers_LV->firstChild(); | 928 | QListViewItem * it = AllDrivers_LV->firstChild(); |
929 | while( it ) { | 929 | while( it ) { |
930 | if( it->isSelected() ) { | 930 | if( it->isSelected() ) { |
931 | OTDriver * D = ((DriverLVI *)it)->driver(); | 931 | OTDriver * D = ((DriverLVI *)it)->driver(); |
932 | owarn << "UP driver " << D->devname() << oendl; | 932 | odebug << "UP driver " << D->devname() << oendl; |
933 | // this | 933 | // this |
934 | D->setUp( Up ); | 934 | D->setUp( Up ); |
935 | return; | 935 | return; |
936 | } | 936 | } |
937 | it = it->nextSibling(); | 937 | it = it->nextSibling(); |
938 | } | 938 | } |
939 | } | 939 | } |
940 | 940 | ||
941 | void OTManage::SLOT_StateChange( OTDriver * D, bool Up ) { | 941 | void OTManage::SLOT_StateChange( OTDriver * D, bool Up ) { |
942 | QListViewItem * it = AllDrivers_LV->firstChild(); | 942 | QListViewItem * it = AllDrivers_LV->firstChild(); |
943 | while( it ) { | 943 | while( it ) { |
944 | if( ((DriverLVI *)it)->driver() == D ) { | 944 | if( ((DriverLVI *)it)->driver() == D ) { |
945 | it->setPixmap( 0, | 945 | it->setPixmap( 0, |
946 | Icons->loadPixmap( ( Up ) ? "bluezon" : "bluezoff" ) ); | 946 | Icons->loadPixmap( ( Up ) ? "bluezon" : "bluezoff" ) ); |
947 | return; | 947 | return; |
948 | } | 948 | } |
949 | it = it->nextSibling(); | 949 | it = it->nextSibling(); |
950 | } | 950 | } |
951 | } | 951 | } |
952 | 952 | ||
953 | void OTManage::SLOT_DriverListChanged( ) { | 953 | void OTManage::SLOT_DriverListChanged( ) { |
954 | DriverLVI * It; | 954 | DriverLVI * It; |
955 | QListViewItem * Sub; | 955 | QListViewItem * Sub; |
956 | QListViewItem * First = 0; | 956 | QListViewItem * First = 0; |
957 | OTDriver* D; | 957 | OTDriver* D; |
958 | OTDriverList & DL = OT->getDriverList(); | 958 | OTDriverList & DL = OT->getDriverList(); |
959 | 959 | ||
960 | AllDrivers_LV->clear(); | 960 | AllDrivers_LV->clear(); |
961 | for( unsigned int i = 0; | 961 | for( unsigned int i = 0; |
962 | i < DL.count(); | 962 | i < DL.count(); |
963 | i ++ ) { | 963 | i ++ ) { |
964 | D = DL[i]; | 964 | D = DL[i]; |
965 | It = new DriverLVI( D, AllDrivers_LV ); | 965 | It = new DriverLVI( D, AllDrivers_LV ); |
966 | 966 | ||
967 | if( ! First ) | 967 | if( ! First ) |
968 | First = It; | 968 | First = It; |
969 | 969 | ||
970 | It->setText( 0, D->devname() ); | 970 | It->setText( 0, D->devname() ); |
971 | It->setPixmap( 0, | 971 | It->setPixmap( 0, |
972 | Icons->loadPixmap( (D->isUp()) ? | 972 | Icons->loadPixmap( (D->isUp()) ? |
973 | "bluezon" : "bluezoff" ) ); | 973 | "bluezon" : "bluezoff" ) ); |
974 | 974 | ||
975 | Sub = new QListViewItem( It ); | 975 | Sub = new QListViewItem( It ); |
976 | Sub->setText( 0, tr( "Name" ) ); | 976 | Sub->setText( 0, tr( "Name" ) ); |
977 | Sub->setText( 1, D->name() ); | 977 | Sub->setText( 1, D->name() ); |
978 | 978 | ||
979 | Sub = new QListViewItem( It ); | 979 | Sub = new QListViewItem( It ); |
980 | Sub->setText( 0, tr( "Address" ) ); | 980 | Sub->setText( 0, tr( "Address" ) ); |
981 | Sub->setText( 1, D->address().toString() ); | 981 | Sub->setText( 1, D->address().toString() ); |
982 | 982 | ||
983 | Sub = new QListViewItem( It ); | 983 | Sub = new QListViewItem( It ); |
984 | Sub->setText( 0, tr( "Revision" ) ); | 984 | Sub->setText( 0, tr( "Revision" ) ); |
985 | Sub->setText( 1, D->revision() ); | 985 | Sub->setText( 1, D->revision() ); |
986 | 986 | ||
987 | Sub = new QListViewItem( It ); | 987 | Sub = new QListViewItem( It ); |
988 | Sub->setText( 0, tr( "Manufacturer" ) ); | 988 | Sub->setText( 0, tr( "Manufacturer" ) ); |
989 | Sub->setText( 1, D->manufacturer() ); | 989 | Sub->setText( 1, D->manufacturer() ); |
990 | 990 | ||
991 | QString Service, Device; | 991 | QString Service, Device; |
992 | D->getClass( Service, Device ); | 992 | D->getClass( Service, Device ); |
993 | 993 | ||
994 | Sub = new QListViewItem( It ); | 994 | Sub = new QListViewItem( It ); |
995 | Sub->setText( 0, tr( "Service classes" ) ); | 995 | Sub->setText( 0, tr( "Service classes" ) ); |
996 | Sub->setText( 1, Service ); | 996 | Sub->setText( 1, Service ); |
997 | Sub = new QListViewItem( It ); | 997 | Sub = new QListViewItem( It ); |
998 | Sub->setText( 0, tr( "Device class" ) ); | 998 | Sub->setText( 0, tr( "Device class" ) ); |
999 | Sub->setText( 1, Device ); | 999 | Sub->setText( 1, Device ); |
1000 | } | 1000 | } |
1001 | 1001 | ||
1002 | if( DL.count() ) { | 1002 | if( DL.count() ) { |
1003 | AllDrivers_LV->setCurrentItem( First ); | 1003 | AllDrivers_LV->setCurrentItem( First ); |
1004 | DriverIsUp_CB->setEnabled( TRUE ); | 1004 | DriverIsUp_CB->setEnabled( TRUE ); |
1005 | } else { | 1005 | } else { |
1006 | DriverIsUp_CB->setChecked( FALSE ); | 1006 | DriverIsUp_CB->setChecked( FALSE ); |
1007 | DriverIsUp_CB->setEnabled( FALSE ); | 1007 | DriverIsUp_CB->setEnabled( FALSE ); |
1008 | } | 1008 | } |
1009 | } | 1009 | } |
1010 | 1010 | ||
1011 | void OTManage::SLOT_SetRefreshTimer( int v ) { | 1011 | void OTManage::SLOT_SetRefreshTimer( int v ) { |
1012 | OT->setRefreshTimer( v * 1000 ); | 1012 | OT->setRefreshTimer( v * 1000 ); |
1013 | } | 1013 | } |
1014 | 1014 | ||
1015 | // | 1015 | // |
1016 | // | 1016 | // |
1017 | // | 1017 | // |
1018 | // | 1018 | // |
1019 | // | 1019 | // |
1020 | 1020 | ||
1021 | OTMain::OTMain( QWidget * parent ) : OTMainGUI( parent ) { | 1021 | OTMain::OTMain( QWidget * parent ) : OTMainGUI( parent ) { |
1022 | 1022 | ||
1023 | Icons = new OTIcons(); | 1023 | Icons = new OTIcons(); |
1024 | SnifWindow = 0; | 1024 | SnifWindow = 0; |
1025 | OT = OTGateway::getOTGateway(); | 1025 | OT = OTGateway::getOTGateway(); |
1026 | 1026 | ||
1027 | connect( OT, | 1027 | connect( OT, |
1028 | SIGNAL( deviceEnabled( bool ) ), | 1028 | SIGNAL( deviceEnabled( bool ) ), |
1029 | this, | 1029 | this, |
1030 | SLOT( SLOT_DeviceIsEnabled( bool ) ) | 1030 | SLOT( SLOT_DeviceIsEnabled( bool ) ) |
1031 | ); | 1031 | ); |
1032 | connect( OT, | 1032 | connect( OT, |
1033 | SIGNAL( driverListChanged() ), | 1033 | SIGNAL( driverListChanged() ), |
1034 | this, | 1034 | this, |
1035 | SLOT( SLOT_DriverListChanged() ) | 1035 | SLOT( SLOT_DriverListChanged() ) |
1036 | ); | 1036 | ); |
1037 | connect( OT, | 1037 | connect( OT, |
1038 | SIGNAL( stateChange( OTDriver *, bool ) ), | 1038 | SIGNAL( stateChange( OTDriver *, bool ) ), |
1039 | this, | 1039 | this, |
1040 | SLOT( SLOT_StateChange( OTDriver *, bool ) ) | 1040 | SLOT( SLOT_StateChange( OTDriver *, bool ) ) |
1041 | ); | 1041 | ); |
1042 | 1042 | ||
1043 | if( ! OT->needsEnabling() ) { | 1043 | if( ! OT->needsEnabling() ) { |
1044 | MustBeEnabled_CB->hide(); | 1044 | MustBeEnabled_CB->hide(); |
1045 | } else { | 1045 | } else { |
1046 | // detect current state | 1046 | // detect current state |
1047 | MustBeEnabled_CB->setChecked( | 1047 | MustBeEnabled_CB->setChecked( |
1048 | OT->isEnabled() ); | 1048 | OT->isEnabled() ); |
1049 | } | 1049 | } |
1050 | 1050 | ||
1051 | SLOT_DriverListChanged(); | 1051 | SLOT_DriverListChanged(); |
1052 | } | 1052 | } |
1053 | 1053 | ||
1054 | OTMain::~OTMain() { | 1054 | OTMain::~OTMain() { |
1055 | OTGateway::releaseOTGateway(); | 1055 | OTGateway::releaseOTGateway(); |
1056 | delete Icons; | 1056 | delete Icons; |
1057 | } | 1057 | } |
1058 | 1058 | ||
1059 | void OTMain::SLOT_DriverListChanged() { | 1059 | void OTMain::SLOT_DriverListChanged() { |
1060 | OTDriver * D; | 1060 | OTDriver * D; |
1061 | OTDriverList & DL = OT->getDriverList(); | 1061 | OTDriverList & DL = OT->getDriverList(); |
1062 | 1062 | ||
1063 | DeviceList_CB->clear(); | 1063 | DeviceList_CB->clear(); |
1064 | for( unsigned int i = 0; | 1064 | for( unsigned int i = 0; |
1065 | i < DL.count(); | 1065 | i < DL.count(); |
1066 | i ++ ) { | 1066 | i ++ ) { |
1067 | D = DL[i]; | 1067 | D = DL[i]; |
1068 | DeviceList_CB->insertItem( | 1068 | DeviceList_CB->insertItem( |
1069 | Icons->loadPixmap( (D->isUp()) ? | 1069 | Icons->loadPixmap( (D->isUp()) ? |
1070 | "bluezon" : "bluezoff" ), | 1070 | "bluezon" : "bluezoff" ), |
1071 | D->devname() ); | 1071 | D->devname() ); |
1072 | if( D == OT->scanWith() ) { | 1072 | if( D == OT->scanWith() ) { |
1073 | DeviceList_CB->setCurrentItem( i ); | 1073 | DeviceList_CB->setCurrentItem( i ); |
1074 | } | 1074 | } |
1075 | } | 1075 | } |
1076 | 1076 | ||
1077 | Scan_But->setEnabled( OT->getDriverList().count() > 0 ); | 1077 | Scan_But->setEnabled( OT->getDriverList().count() > 0 ); |
1078 | DeviceList_CB->setEnabled( OT->getDriverList().count() > 0 ); | 1078 | DeviceList_CB->setEnabled( OT->getDriverList().count() > 0 ); |
1079 | } | 1079 | } |
1080 | 1080 | ||
1081 | void OTMain::SLOT_EnableBluetooth( bool Up ) { | 1081 | void OTMain::SLOT_EnableBluetooth( bool Up ) { |
1082 | OT->SLOT_SetEnabled( Up ); | 1082 | OT->SLOT_SetEnabled( Up ); |
1083 | } | 1083 | } |
1084 | 1084 | ||
1085 | void OTMain::SLOT_DeviceIsEnabled( bool Up ) { | 1085 | void OTMain::SLOT_DeviceIsEnabled( bool Up ) { |
1086 | MustBeEnabled_CB->blockSignals( TRUE ); | 1086 | MustBeEnabled_CB->blockSignals( TRUE ); |
1087 | MustBeEnabled_CB->setChecked( Up ); | 1087 | MustBeEnabled_CB->setChecked( Up ); |
1088 | MustBeEnabled_CB->blockSignals( FALSE ); | 1088 | MustBeEnabled_CB->blockSignals( FALSE ); |
1089 | } | 1089 | } |
1090 | 1090 | ||
1091 | void OTMain::SLOT_Manage( void ) { | 1091 | void OTMain::SLOT_Manage( void ) { |
1092 | QDialog * Dlg = new QDialog( this, 0, TRUE ); | 1092 | QDialog * Dlg = new QDialog( this, 0, TRUE ); |
1093 | QVBoxLayout * V = new QVBoxLayout( Dlg ); | 1093 | QVBoxLayout * V = new QVBoxLayout( Dlg ); |
1094 | OTManage * Mng = new OTManage( Dlg, Icons ); | 1094 | OTManage * Mng = new OTManage( Dlg, Icons ); |
1095 | 1095 | ||
1096 | V->addWidget( Mng ); | 1096 | V->addWidget( Mng ); |
1097 | 1097 | ||
1098 | Dlg->setCaption( tr("Manage local devices" ) ); | 1098 | Dlg->setCaption( tr("Manage local devices" ) ); |
1099 | Dlg->showMaximized(); | 1099 | Dlg->showMaximized(); |
1100 | Dlg->exec(); | 1100 | Dlg->exec(); |
1101 | delete Dlg; | 1101 | delete Dlg; |
1102 | } | 1102 | } |
1103 | 1103 | ||
1104 | void OTMain::SLOT_Scan( void ) { | 1104 | void OTMain::SLOT_Scan( void ) { |
1105 | OTDriverList & DL = OT->getDriverList(); | 1105 | OTDriverList & DL = OT->getDriverList(); |
1106 | for( unsigned int i = 0; | 1106 | for( unsigned int i = 0; |
1107 | i < DL.count(); | 1107 | i < DL.count(); |
1108 | i ++ ) { | 1108 | i ++ ) { |
1109 | if( DL[i]->isUp() && | 1109 | if( DL[i]->isUp() && |
1110 | DL[i]->devname() == DeviceList_CB->currentText() | 1110 | DL[i]->devname() == DeviceList_CB->currentText() |
1111 | ) { | 1111 | ) { |
1112 | QDialog * Dlg = new QDialog( this, 0, TRUE ); | 1112 | QDialog * Dlg = new QDialog( this, 0, TRUE ); |
1113 | QVBoxLayout * V = new QVBoxLayout( Dlg ); | 1113 | QVBoxLayout * V = new QVBoxLayout( Dlg ); |
1114 | OTScan * Scn = new OTScan( Dlg, Icons ); | 1114 | OTScan * Scn = new OTScan( Dlg, Icons ); |
1115 | 1115 | ||
1116 | OT->setScanWith( OT->driver(i) ); | 1116 | OT->setScanWith( OT->driver(i) ); |
1117 | V->addWidget( Scn ); | 1117 | V->addWidget( Scn ); |
1118 | Dlg->setCaption( tr("Scan Neighbourhood" ) ); | 1118 | Dlg->setCaption( tr("Scan Neighbourhood" ) ); |
1119 | Dlg->showMaximized(); | 1119 | Dlg->showMaximized(); |
1120 | Dlg->exec(); | 1120 | Dlg->exec(); |
1121 | 1121 | ||
1122 | delete Dlg; | 1122 | delete Dlg; |
1123 | return; | 1123 | return; |
1124 | } | 1124 | } |
1125 | } | 1125 | } |
1126 | 1126 | ||
1127 | } | 1127 | } |
1128 | 1128 | ||
1129 | void OTMain::SLOT_StateChange( OTDriver * D, bool Up ) { | 1129 | void OTMain::SLOT_StateChange( OTDriver * D, bool Up ) { |
1130 | for( int i = 0; | 1130 | for( int i = 0; |
1131 | i < DeviceList_CB->count(); | 1131 | i < DeviceList_CB->count(); |
1132 | i ++ ) { | 1132 | i ++ ) { |
1133 | if( DeviceList_CB->text(i) == D->devname() ) { | 1133 | if( DeviceList_CB->text(i) == D->devname() ) { |
1134 | DeviceList_CB->changeItem( | 1134 | DeviceList_CB->changeItem( |
1135 | Icons->loadPixmap( (Up) ? "bluezon" : "bluezoff" ), | 1135 | Icons->loadPixmap( (Up) ? "bluezon" : "bluezoff" ), |
1136 | D->devname(), | 1136 | D->devname(), |
1137 | i ); | 1137 | i ); |
1138 | return; | 1138 | return; |
1139 | } | 1139 | } |
1140 | } | 1140 | } |
1141 | } | 1141 | } |
1142 | 1142 | ||
1143 | void OTMain::SLOT_Pairing( void ) { | 1143 | void OTMain::SLOT_Pairing( void ) { |
1144 | QDialog * Dlg = new QDialog( this, 0, TRUE ); | 1144 | QDialog * Dlg = new QDialog( this, 0, TRUE ); |
1145 | QVBoxLayout * V = new QVBoxLayout( Dlg ); | 1145 | QVBoxLayout * V = new QVBoxLayout( Dlg ); |
1146 | OTPairing * Pair = new OTPairing( Dlg, Icons ); | 1146 | OTPairing * Pair = new OTPairing( Dlg, Icons ); |
1147 | 1147 | ||
1148 | V->addWidget( Pair ); | 1148 | V->addWidget( Pair ); |
1149 | Dlg->showMaximized(); | 1149 | Dlg->showMaximized(); |
1150 | Dlg->setCaption( tr("Manage pairing" ) ); | 1150 | Dlg->setCaption( tr("Manage pairing" ) ); |
1151 | Dlg->exec(); | 1151 | Dlg->exec(); |
1152 | 1152 | ||
1153 | delete Dlg; | 1153 | delete Dlg; |
1154 | } | 1154 | } |
1155 | 1155 | ||
1156 | void OTMain::SLOT_Sniffing( void ) { | 1156 | void OTMain::SLOT_Sniffing( void ) { |
1157 | 1157 | ||
1158 | if( SnifWindow == 0 ) { | 1158 | if( SnifWindow == 0 ) { |
1159 | SnifWindow = new QDialog( this, 0, FALSE ); | 1159 | SnifWindow = new QDialog( this, 0, FALSE ); |
1160 | QVBoxLayout * V = new QVBoxLayout( SnifWindow ); | 1160 | QVBoxLayout * V = new QVBoxLayout( SnifWindow ); |
1161 | OTSniffing * SN = new OTSniffing( SnifWindow ); | 1161 | OTSniffing * SN = new OTSniffing( SnifWindow ); |
1162 | V->addWidget( SN ); | 1162 | V->addWidget( SN ); |
1163 | } | 1163 | } |
1164 | 1164 | ||
1165 | SnifWindow->showMaximized(); | 1165 | SnifWindow->showMaximized(); |
1166 | SnifWindow->show(); | 1166 | SnifWindow->show(); |
1167 | } | 1167 | } |
diff --git a/noncore/settings/networksettings2/opietooth2/config.in b/noncore/settings/networksettings2/opietooth2/config.in index 720f49a..084e8c0 100644 --- a/noncore/settings/networksettings2/opietooth2/config.in +++ b/noncore/settings/networksettings2/opietooth2/config.in | |||
@@ -1,5 +1,5 @@ | |||
1 | config NS2OPIETOOTH | 1 | config NS2OPIETOOTH |
2 | boolean "opie-networksettings2 bluetooth library" | 2 | boolean "Opietooth2 bluetooth library" |
3 | default "y" | 3 | default "y" |
4 | depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE | 4 | depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE && LIBBLUEZ_DEP && NS2CORE |
5 | 5 | ||
diff --git a/noncore/settings/networksettings2/opietooth2/libopietooth2.postinst b/noncore/settings/networksettings2/opietooth2/libopietooth2.postinst index cd605c2..2713c61 100755 --- a/noncore/settings/networksettings2/opietooth2/libopietooth2.postinst +++ b/noncore/settings/networksettings2/opietooth2/libopietooth2.postinst | |||
@@ -1,10 +1,10 @@ | |||
1 | #!/bin/sh | 1 | #!/bin/sh |
2 | 2 | ||
3 | QTPB=/opt/QtPalmtop/bin | 3 | QTPB=/opt/QtPalmtop/bin |
4 | 4 | ||
5 | [ ! -L ${QTPB}/networksettings2-opietooth ] && ln -sf ${QTPB}/networksettings2 ${QTPB}/networksettings2-opietooth | 5 | [ ! -L ${QTPB}/networksettings2-opietooth ] && ln -sf ${QTPB}/networksettings2 ${QTPB}/networksettings2-opietooth |
6 | 6 | ||
7 | # qcop QPE/Taskbar "linkChanged(opietooth)" | 7 | # qcop QPE/Taskbar "linkChanged(opietooth)" |
8 | qcop QPE/Taskbar "reloadApps()" | 8 | ${QTPB}/qcop QPE/Taskbar "reloadApps()" |
9 | 9 | ||
10 | exit 0 | 10 | exit 0 |
diff --git a/noncore/settings/networksettings2/opietooth2/opietooth2.pro b/noncore/settings/networksettings2/opietooth2/opietooth2.pro index e0057a9..16277cf 100644 --- a/noncore/settings/networksettings2/opietooth2/opietooth2.pro +++ b/noncore/settings/networksettings2/opietooth2/opietooth2.pro | |||
@@ -1,37 +1,44 @@ | |||
1 | TEMPLATE = lib | 1 | TEMPLATE = lib |
2 | CONFIG += qt warn_on release | 2 | CONFIG += qt warn_on release |
3 | #CONFIG += qt warn_on debug | 3 | #CONFIG += qt warn_on debug |
4 | DESTDIR = $(OPIEDIR)/lib$(PROJMAK) | 4 | DESTDIR = $(OPIEDIR)/lib$(PROJMAK) |
5 | HEADERS = OTDevice.h \ | 5 | HEADERS = OTDevice.h \ |
6 | OTDriver.h \ | 6 | OTDriver.h \ |
7 | OTGateway.h \ | 7 | OTGateway.h \ |
8 | OTHCISocket.h \ | 8 | OTHCISocket.h \ |
9 | OTInquiry.h \ | 9 | OTInquiry.h \ |
10 | OTDeviceAddress.h \ | 10 | OTDeviceAddress.h \ |
11 | OTIcons.h \ | 11 | OTIcons.h \ |
12 | OTUUID.h \ | 12 | OTUUID.h \ |
13 | OTSDPAttribute.h \ | 13 | OTSDPAttribute.h \ |
14 | OTSDPService.h \ | 14 | OTSDPService.h \ |
15 | OTPeer.h \ | 15 | OTPeer.h \ |
16 | Opietooth.h | 16 | Opietooth.h |
17 | SOURCES = OTDevice.cpp \ | 17 | SOURCES = OTDevice.cpp \ |
18 | OTDriver.cpp \ | 18 | OTDriver.cpp \ |
19 | OTDriverList.cpp \ | 19 | OTDriverList.cpp \ |
20 | OTHCISocket.cpp \ | 20 | OTHCISocket.cpp \ |
21 | OTInquiry.cpp \ | 21 | OTInquiry.cpp \ |
22 | OTDeviceAddress.cpp \ | 22 | OTDeviceAddress.cpp \ |
23 | OTUUID.cpp \ | 23 | OTUUID.cpp \ |
24 | OTSDPAttribute.cpp \ | 24 | OTSDPAttribute.cpp \ |
25 | OTSDPService.cpp \ | 25 | OTSDPService.cpp \ |
26 | OTIcons.cpp \ | 26 | OTIcons.cpp \ |
27 | OTPeer.cpp \ | 27 | OTPeer.cpp \ |
28 | OTGateway.cpp \ | 28 | OTGateway.cpp \ |
29 | Opietooth.cpp | 29 | Opietooth.cpp |
30 | INCLUDEPATH+= $(OPIEDIR)/include ../networksettings2 | 30 | INCLUDEPATH+= $(OPIEDIR)/include ../networksettings2 |
31 | DEPENDPATH+= $(OPIEDIR)/include | 31 | DEPENDPATH+= $(OPIEDIR)/include |
32 | LIBS += -lqpe -lopiecore2 -lbluetooth -lnetworksettings2 | 32 | LIBS += -lqpe -lopiecore2 -lbluetooth -lnetworksettings2 |
33 | INTERFACES= OTMainGUI.ui OTSniffGUI.ui OTScanGUI.ui OTManageGUI.ui OTPairingGUI.ui | 33 | INTERFACES= OTMainGUI.ui OTSniffGUI.ui OTScanGUI.ui OTManageGUI.ui OTPairingGUI.ui |
34 | TARGET = opietooth2 | 34 | TARGET = opietooth2 |
35 | VERSION = 1.0.0 | 35 | VERSION = 1.0.0 |
36 | 36 | ||
37 | include ( $(OPIEDIR)/include.pro ) | 37 | include ( $(OPIEDIR)/include.pro ) |
38 | |||
39 | !isEmpty( LIBBLUEZ_INC_DIR ) { | ||
40 | INCLUDEPATH += $$LIBBLUEZ_INC_DIR | ||
41 | } | ||
42 | !isEmpty( LIBBLUEZ_LIB_DIR ) { | ||
43 | LIBS += -L$$LIBBLUEZ_LIB_DIR | ||
44 | } | ||
diff --git a/noncore/settings/networksettings2/profile/profilerun.cpp b/noncore/settings/networksettings2/profile/profilerun.cpp index ab57a00..acb67bd 100644 --- a/noncore/settings/networksettings2/profile/profilerun.cpp +++ b/noncore/settings/networksettings2/profile/profilerun.cpp | |||
@@ -1,27 +1,27 @@ | |||
1 | #include <resources.h> | 1 | #include <resources.h> |
2 | 2 | ||
3 | #include "profilerun.h" | 3 | #include "profilerun.h" |
4 | 4 | ||
5 | State_t ProfileRun::detectState( void ) { | 5 | State_t ProfileRun::detectState( void ) { |
6 | if( Data->Disabled ) { | 6 | if( Data->Disabled ) { |
7 | return Disabled; | 7 | return Disabled; |
8 | } | 8 | } |
9 | return Unknown; | 9 | return Unknown; |
10 | } | 10 | } |
11 | 11 | ||
12 | QString ProfileRun::setMyState( NodeCollection * NC, Action_t A, bool ) { | 12 | QString ProfileRun::setMyState( NodeCollection * NC, Action_t A, bool ) { |
13 | owarn << "Profile " << Data->Disabled << oendl; | 13 | odebug << "Profile " << Data->Disabled << oendl; |
14 | if( A == Disable ) { | 14 | if( A == Disable ) { |
15 | if( ! Data->Disabled ) { | 15 | if( ! Data->Disabled ) { |
16 | Data->Disabled = 1; | 16 | Data->Disabled = 1; |
17 | NC->setModified( 1 ); | 17 | NC->setModified( 1 ); |
18 | } | 18 | } |
19 | } else if( A == Enable ) { | 19 | } else if( A == Enable ) { |
20 | if( Data->Disabled ) { | 20 | if( Data->Disabled ) { |
21 | Data->Disabled = 0; | 21 | Data->Disabled = 0; |
22 | NC->setModified( 1 ); | 22 | NC->setModified( 1 ); |
23 | } | 23 | } |
24 | } | 24 | } |
25 | 25 | ||
26 | return QString(); | 26 | return QString(); |
27 | } | 27 | } |
diff --git a/noncore/settings/networksettings2/usb/usbrun.cpp b/noncore/settings/networksettings2/usb/usbrun.cpp index eb439c1..de8c8a2 100644 --- a/noncore/settings/networksettings2/usb/usbrun.cpp +++ b/noncore/settings/networksettings2/usb/usbrun.cpp | |||
@@ -1,119 +1,120 @@ | |||
1 | #include <qfile.h> | 1 | #include <qfile.h> |
2 | #include <qfileinfo.h> | 2 | #include <qfileinfo.h> |
3 | #include <qtextstream.h> | 3 | #include <qtextstream.h> |
4 | #include <resources.h> | 4 | #include <resources.h> |
5 | #include "usbrun.h" | 5 | #include "usbrun.h" |
6 | 6 | ||
7 | State_t USBRun::detectState( void ) { | 7 | State_t USBRun::detectState( void ) { |
8 | 8 | ||
9 | // unavailable : no card found | 9 | // unavailable : no card found |
10 | // available : card found and assigned to us or free | 10 | // available : card found and assigned to us or free |
11 | // up : card found and assigned to us and up | 11 | // up : card found and assigned to us and up |
12 | 12 | ||
13 | NodeCollection * NC = nodeCollection(); | 13 | NodeCollection * NC = nodeCollection(); |
14 | QString S = QString( "/tmp/profile-%1.up" ).arg(NC->number()); | 14 | QString S = QString( "/tmp/profile-%1.up" ).arg(NC->number()); |
15 | System & Sys = NSResources->system(); | 15 | System & Sys = NSResources->system(); |
16 | InterfaceInfo * Run; | 16 | InterfaceInfo * Run; |
17 | QFile F( S ); | 17 | QFile F( S ); |
18 | Log(("Detecting for %s\n", NC->name().latin1() )); | 18 | Log(("Detecting for %s\n", NC->name().latin1() )); |
19 | 19 | ||
20 | if( F.open( IO_ReadOnly ) ) { | 20 | if( F.open( IO_ReadOnly ) ) { |
21 | // could open file -> read interface and assign | 21 | // could open file -> read interface and assign |
22 | QString X; | 22 | QString X; |
23 | QTextStream TS(&F); | 23 | QTextStream TS(&F); |
24 | X = TS.readLine(); | 24 | X = TS.readLine(); |
25 | Log(("%s exists\n", S.latin1() )); | 25 | Log(("%s exists\n", S.latin1() )); |
26 | // find interface | 26 | // find interface |
27 | if( handlesInterface( X ) ) { | 27 | if( handlesInterface( X ) ) { |
28 | for( QDictIterator<InterfaceInfo> It(Sys.interfaces()); | 28 | for( QDictIterator<InterfaceInfo> It(Sys.interfaces()); |
29 | It.current(); | 29 | It.current(); |
30 | ++It ) { | 30 | ++It ) { |
31 | Run = It.current(); | 31 | Run = It.current(); |
32 | if( X == Run->Name ) { | 32 | if( X == Run->Name ) { |
33 | NC->assignInterface( Run ); | 33 | NC->assignInterface( Run ); |
34 | return IsUp; | 34 | return IsUp; |
35 | } | 35 | } |
36 | } | 36 | } |
37 | } | 37 | } |
38 | } | 38 | } |
39 | 39 | ||
40 | Log(("Assigned %p\n", NC->assignedInterface() )); | 40 | Log(("Assigned %p\n", NC->assignedInterface() )); |
41 | |||
41 | if( ( Run = NC->assignedInterface() ) ) { | 42 | if( ( Run = NC->assignedInterface() ) ) { |
42 | // we already have an interface assigned -> still present ? | 43 | // we already have an interface assigned -> still present ? |
43 | if( ! Run->IsUp ) { | 44 | if( ! Run->IsUp ) { |
44 | // usb is still free -> keep assignment | 45 | // usb is still free -> keep assignment |
45 | return Available; | 46 | return Available; |
46 | } // else interface is up but NOT us -> some other profile | 47 | } // else interface is up but NOT us -> some other profile |
47 | } | 48 | } |
48 | 49 | ||
49 | // nothing (valid) assigned to us | 50 | // nothing (valid) assigned to us |
50 | NC->assignInterface( 0 ); | 51 | NC->assignInterface( 0 ); |
51 | 52 | ||
52 | // find possible interface | 53 | // find possible interface |
53 | for( QDictIterator<InterfaceInfo> It(Sys.interfaces()); | 54 | if( getInterface() ) { |
54 | It.current(); | 55 | // proper type, and Not UP -> free |
55 | ++It ) { | 56 | // usb cables are currently always available when requested |
56 | Run = It.current(); | 57 | // until we can detect if we are plugged in |
57 | 58 | return Available; | |
58 | Log(("%s %d %d=%d %d\n", | ||
59 | Run->Name.latin1(), | ||
60 | handlesInterface( Run->Name ), | ||
61 | Run->CardType, ARPHRD_ETHER, | ||
62 | ! Run->IsUp )); | ||
63 | |||
64 | if( handlesInterface( Run->Name ) && | ||
65 | Run->CardType == ARPHRD_ETHER && | ||
66 | ! Run->IsUp | ||
67 | ) { | ||
68 | // proper type, and Not UP -> free | ||
69 | // usb cables are currently always available when requested | ||
70 | // until we can detect if we are plugged in | ||
71 | return Available; | ||
72 | } | ||
73 | } | 59 | } |
74 | 60 | ||
75 | return Unavailable; | 61 | return Unavailable; |
76 | } | 62 | } |
77 | 63 | ||
78 | QString USBRun::setMyState( NodeCollection * NC, Action_t A, bool ) { | 64 | QString USBRun::setMyState( NodeCollection * NC, Action_t A, bool ) { |
79 | 65 | ||
80 | // nothing needs to be done to 'activate' or 'deactivate' | 66 | InterfaceInfo * I = getInterface(); |
81 | // a cable | 67 | |
68 | if( ! I ) { | ||
69 | return QString("No usb device available"); | ||
70 | } | ||
71 | |||
72 | Log(( "Grabbed USB interface %s\n", I->Name.latin1() )); | ||
73 | // grab this interface | ||
74 | NC->assignInterface( I ); | ||
75 | |||
82 | return QString(); | 76 | return QString(); |
83 | } | 77 | } |
84 | 78 | ||
85 | // get interface that is free or assigned to us | 79 | // get interface that is free or assigned to us |
86 | InterfaceInfo * USBRun::getInterface( void ) { | 80 | InterfaceInfo * USBRun::getInterface( void ) { |
87 | 81 | ||
88 | System & S = NSResources->system(); | 82 | System & S = NSResources->system(); |
89 | InterfaceInfo * best = 0, * Run; | 83 | InterfaceInfo * best = 0, * Run; |
90 | QRegExp R( "usb[0-9abcdef]" ); | ||
91 | 84 | ||
92 | for( QDictIterator<InterfaceInfo> It(S.interfaces()); | 85 | for( QDictIterator<InterfaceInfo> It(S.interfaces()); |
93 | It.current(); | 86 | It.current(); |
94 | ++It ) { | 87 | ++It ) { |
95 | Run = It.current(); | 88 | Run = It.current(); |
89 | |||
90 | Log(("%s %d %d=%d %d\n", | ||
91 | Run->Name.latin1(), | ||
92 | handlesInterface( Run->Name ), | ||
93 | Run->CardType, ARPHRD_ETHER, | ||
94 | ! Run->IsUp )); | ||
95 | |||
96 | if( handlesInterface( Run->Name ) && | 96 | if( handlesInterface( Run->Name ) && |
97 | Run->CardType == ARPHRD_ETHER | 97 | Run->CardType == ARPHRD_ETHER |
98 | ) { | 98 | ) { |
99 | // this is a USB card | 99 | // this is a USB card |
100 | if( Run->assignedConnection() == netNode()->connection() ) { | 100 | if( Run->assignedConnection() == netNode()->connection() ) { |
101 | // assigned to us | 101 | // assigned to us |
102 | return Run; | 102 | return Run; |
103 | } else if( Run->assignedConnection() == 0 ) { | 103 | } else if( ! Run->IsUp && |
104 | Run->assignedConnection() == 0 ) { | ||
104 | // free | 105 | // free |
105 | best = Run; | 106 | best = Run; |
106 | } | 107 | } // UP or not assigned to us |
107 | } | 108 | } |
108 | } | 109 | } |
109 | return best; // can be 0 | 110 | return best; // can be 0 |
110 | } | 111 | } |
111 | 112 | ||
112 | bool USBRun::handlesInterface( const QString & S ) { | 113 | bool USBRun::handlesInterface( const QString & S ) { |
113 | return Pat.match( S ) >= 0; | 114 | return Pat.match( S ) >= 0; |
114 | } | 115 | } |
115 | 116 | ||
116 | bool USBRun::handlesInterface( InterfaceInfo * I ) { | 117 | bool USBRun::handlesInterface( InterfaceInfo * I ) { |
117 | return handlesInterface( I->Name ); | 118 | return handlesInterface( I->Name ); |
118 | } | 119 | } |
119 | 120 | ||