summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/obex/btobex.cpp2
-rw-r--r--core/obex/obex.cpp3
-rw-r--r--core/obex/obex.h3
-rw-r--r--core/obex/obexserver.cpp24
-rw-r--r--core/obex/obexserver.h4
5 files changed, 21 insertions, 15 deletions
diff --git a/core/obex/btobex.cpp b/core/obex/btobex.cpp
index 212a084..4e078b0 100644
--- a/core/obex/btobex.cpp
+++ b/core/obex/btobex.cpp
@@ -1,164 +1,164 @@
1/* 1/*
2               =. This file is part of the OPIE Project 2               =. This file is part of the OPIE Project
3             .=l. Copyright (c) 2002 Maximilian Reiss <max.reiss@gmx.de> 3             .=l. Copyright (c) 2002 Maximilian Reiss <max.reiss@gmx.de>
4           .>+-= 4           .>+-=
5 _;:,     .>    :=|. This library is free software; you can 5 _;:,     .>    :=|. This library is free software; you can
6.> <,   >  .   <= redistribute it and/or modify it under 6.> <,   >  .   <= redistribute it and/or modify it under
7:=1 )Y*s>-.--   : the terms of the GNU Library General Public 7:=1 )Y*s>-.--   : the terms of the GNU Library General Public
8.="- .-=="i,     .._ License as published by the Free Software 8.="- .-=="i,     .._ License as published by the Free Software
9 - .   .-<_>     .<> Foundation; version 2 of the License. 9 - .   .-<_>     .<> Foundation; version 2 of the License.
10     ._= =}       : 10     ._= =}       :
11    .%+i>       _;_. 11    .%+i>       _;_.
12    .i_,=:_.      -<s. This library is distributed in the hope that 12    .i_,=:_.      -<s. This library is distributed in the hope that
13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
14    : ..    .:,     . . . without even the implied warranty of 14    : ..    .:,     . . . without even the implied warranty of
15    =_        +     =;=| MERCHANTABILITY or FITNESS FOR A 15    =_        +     =;=| MERCHANTABILITY or FITNESS FOR A
16  _.=:.       :    :=>: PARTICULAR PURPOSE. See the GNU 16  _.=:.       :    :=>: PARTICULAR PURPOSE. See the GNU
17..}^=.=       =       ; Library General Public License for more 17..}^=.=       =       ; Library General Public License for more
18++=   -.     .     .: details. 18++=   -.     .     .: details.
19 :     =  ...= . :.=- 19 :     =  ...= . :.=-
20 -.   .:....=;==+<; You should have received a copy of the GNU 20 -.   .:....=;==+<; You should have received a copy of the GNU
21  -_. . .   )=.  = Library General Public License along with 21  -_. . .   )=.  = Library General Public License along with
22   --        :-= this library; see the file COPYING.LIB. 22   --        :-= this library; see the file COPYING.LIB.
23 If not, write to the Free Software Foundation, 23 If not, write to the Free Software Foundation,
24 Inc., 59 Temple Place - Suite 330, 24 Inc., 59 Temple Place - Suite 330,
25 Boston, MA 02111-1307, USA. 25 Boston, MA 02111-1307, USA.
26 26
27*/ 27*/
28/* 28/*
29 * The Bluetooth OBEX manipulating class implementation 29 * The Bluetooth OBEX manipulating class implementation
30 */ 30 */
31 31
32#include "btobex.h" 32#include "btobex.h"
33#include <manager.h> 33#include <manager.h>
34#include <services.h> 34#include <services.h>
35 35
36/* OPIE */ 36/* OPIE */
37#include <opie2/oprocess.h> 37#include <opie2/oprocess.h>
38#include <opie2/odebug.h> 38#include <opie2/odebug.h>
39 39
40/* QT */ 40/* QT */
41#include <qfileinfo.h> 41#include <qfileinfo.h>
42#include <qstring.h> 42#include <qstring.h>
43#include <qmap.h> 43#include <qmap.h>
44#include <qmessagebox.h> 44#include <qmessagebox.h>
45 45
46using namespace OpieObex; 46using namespace OpieObex;
47 47
48using namespace Opie::Core; 48using namespace Opie::Core;
49/* TRANSLATOR OpieObex::Obex */ 49/* TRANSLATOR OpieObex::Obex */
50using namespace OpieTooth; 50using namespace OpieTooth;
51 51
52BtObex::BtObex( QObject *parent, const char* name ) 52BtObex::BtObex( QObject *parent, const char* name )
53 : ObexBase(parent, name ) 53 : ObexBase(parent, name )
54{ 54{
55 m_rec = 0; 55 m_rec = 0;
56 m_send=0; 56 m_send=0;
57 btManager = NULL; 57 btManager = NULL;
58}; 58};
59 59
60BtObex::~BtObex() { 60BtObex::~BtObex() {
61 delete btManager; 61 delete btManager;
62 delete m_rec; 62 delete m_rec;
63 delete m_send; 63 delete m_send;
64} 64}
65 65
66void BtObex::receive() { 66void BtObex::receive() {
67 ObexBase::receive(); 67 ObexBase::receive();
68 m_rec = new ObexServer(); 68 m_rec = new ObexServer(OBEX_TRANS_BLUETOOTH);
69 69
70 odebug << "BT OBEX do receive" << oendl; 70 odebug << "BT OBEX do receive" << oendl;
71 // TODO mbhaynie: No idea if this actually works -- maybe opd is better. 71 // TODO mbhaynie: No idea if this actually works -- maybe opd is better.
72 // connect to the necessary slots 72 // connect to the necessary slots
73 connect(m_rec, SIGNAL(processExited(Opie::Core::OProcess*) ), 73 connect(m_rec, SIGNAL(processExited(Opie::Core::OProcess*) ),
74 this, SLOT(slotExited(Opie::Core::OProcess*) ) ); 74 this, SLOT(slotExited(Opie::Core::OProcess*) ) );
75 75
76 connect(m_rec, SIGNAL(receivedStdout(Opie::Core::OProcess*, char*, int ) ), 76 connect(m_rec, SIGNAL(receivedStdout(Opie::Core::OProcess*, char*, int ) ),
77 this, SLOT(slotStdOut(Opie::Core::OProcess*, char*, int) ) ); 77 this, SLOT(slotStdOut(Opie::Core::OProcess*, char*, int) ) );
78 78
79 if(!m_rec->start(OProcess::NotifyOnExit, OProcess::AllOutput) ) { 79 if(!m_rec->start(OProcess::NotifyOnExit, OProcess::AllOutput) ) {
80 emit done( false ); 80 emit done( false );
81 delete m_rec; 81 delete m_rec;
82 m_rec = 0; 82 m_rec = 0;
83 } 83 }
84} 84}
85 85
86void BtObex::send( const QString& fileName, const QString& bdaddr) { 86void BtObex::send( const QString& fileName, const QString& bdaddr) {
87 ObexBase::send(fileName, bdaddr); 87 ObexBase::send(fileName, bdaddr);
88 // if currently receiving stop it send receive 88 // if currently receiving stop it send receive
89 if (m_send != 0) { 89 if (m_send != 0) {
90 if (m_send->isSending()) 90 if (m_send->isSending())
91 return; 91 return;
92 else { 92 else {
93 delete m_send; 93 delete m_send;
94 m_send = 0; 94 m_send = 0;
95 } 95 }
96 } 96 }
97 if (m_rec != 0 ) { 97 if (m_rec != 0 ) {
98 if (m_rec->isRunning() ) { 98 if (m_rec->isRunning() ) {
99 emit error(-1 ); 99 emit error(-1 );
100 delete m_rec; 100 delete m_rec;
101 m_rec = 0; 101 m_rec = 0;
102 102
103 }else{ 103 }else{
104 emit error( -1 ); // we did not delete yet but it's not running slotExited is pending 104 emit error( -1 ); // we did not delete yet but it's not running slotExited is pending
105 return; 105 return;
106 } 106 }
107 } 107 }
108 //Now we need to find out if the OBEX push is supported for this device 108 //Now we need to find out if the OBEX push is supported for this device
109 //And get the port number 109 //And get the port number
110 if (!btManager) { 110 if (!btManager) {
111 btManager = new Manager("hci0"); 111 btManager = new Manager("hci0");
112 connect(btManager, 112 connect(btManager,
113 SIGNAL(foundServices(const QString&, Services::ValueList)), 113 SIGNAL(foundServices(const QString&, Services::ValueList)),
114 this, SLOT(slotFoundServices(const QString&, Services::ValueList))); 114 this, SLOT(slotFoundServices(const QString&, Services::ValueList)));
115 } 115 }
116 btManager->searchServices(bdaddr); 116 btManager->searchServices(bdaddr);
117} 117}
118 118
119/** 119/**
120 * This function reacts on the service discovery finish 120 * This function reacts on the service discovery finish
121 */ 121 */
122void BtObex::slotFoundServices(const QString&, Services::ValueList svcList) 122void BtObex::slotFoundServices(const QString&, Services::ValueList svcList)
123{ 123{
124 QValueList<OpieTooth::Services>::Iterator it; 124 QValueList<OpieTooth::Services>::Iterator it;
125 QMap<int, QString> classList; //The classes list 125 QMap<int, QString> classList; //The classes list
126 QMap<int, QString>::Iterator classIt; //Iterator in the class list 126 QMap<int, QString>::Iterator classIt; //Iterator in the class list
127 int portNum = -1; //The desired port number 127 int portNum = -1; //The desired port number
128 odebug << "BtObex slotFoundServices" << oendl; 128 odebug << "BtObex slotFoundServices" << oendl;
129 if (svcList.isEmpty()) { 129 if (svcList.isEmpty()) {
130 QMessageBox::critical(NULL, tr("Object send"), tr("No services found")); 130 QMessageBox::critical(NULL, tr("Object send"), tr("No services found"));
131 emit error(-1); 131 emit error(-1);
132 return; 132 return;
133 } 133 }
134 for (it = svcList.begin(); it != svcList.end(); it++) { 134 for (it = svcList.begin(); it != svcList.end(); it++) {
135 classList = (*it).classIdList(); 135 classList = (*it).classIdList();
136 classIt = classList.begin(); 136 classIt = classList.begin();
137 if (classIt == classList.end()) 137 if (classIt == classList.end())
138 continue; 138 continue;
139////We really need symbolic names for service IDs 139////We really need symbolic names for service IDs
140 //Ok, we have found the object push service 140 //Ok, we have found the object push service
141 if (classIt.key() == 4357) { 141 if (classIt.key() == 4357) {
142 portNum = (*it).protocolDescriptorList().last().port(); 142 portNum = (*it).protocolDescriptorList().last().port();
143 break; 143 break;
144 } 144 }
145 } 145 }
146 if (portNum == -1) { 146 if (portNum == -1) {
147 QMessageBox::critical(NULL, tr("Object send"), 147 QMessageBox::critical(NULL, tr("Object send"),
148 tr("No OBEX Push service")); 148 tr("No OBEX Push service"));
149 emit error(-1); 149 emit error(-1);
150 return; 150 return;
151 } 151 }
152 m_port = portNum; 152 m_port = portNum;
153 sendNow(); 153 sendNow();
154} 154}
155 155
156void BtObex::sendNow(){ 156void BtObex::sendNow(){
157 QString m_dst = ""; 157 QString m_dst = "";
158 int result; //function call result 158 int result; //function call result
159 if ( m_count >= 25 ) { // could not send 159 if ( m_count >= 25 ) { // could not send
160 emit error(-1 ); 160 emit error(-1 );
161 emit sent(false); 161 emit sent(false);
162 return; 162 return;
163 } 163 }
164 // OProcess inititialisation 164 // OProcess inititialisation
diff --git a/core/obex/obex.cpp b/core/obex/obex.cpp
index 95c561a..e4a3c31 100644
--- a/core/obex/obex.cpp
+++ b/core/obex/obex.cpp
@@ -1,157 +1,156 @@
1/* 1/*
2               =. This file is part of the OPIE Project 2               =. This file is part of the OPIE Project
3             .=l. Copyright (c) 2002 Maximilian Reiss <max.reiss@gmx.de> 3             .=l. Copyright (c) 2002 Maximilian Reiss <max.reiss@gmx.de>
4           .>+-= 4           .>+-=
5 _;:,     .>    :=|. This library is free software; you can 5 _;:,     .>    :=|. This library is free software; you can
6.> <,   >  .   <= redistribute it and/or modify it under 6.> <,   >  .   <= redistribute it and/or modify it under
7:=1 )Y*s>-.--   : the terms of the GNU Library General Public 7:=1 )Y*s>-.--   : the terms of the GNU Library General Public
8.="- .-=="i,     .._ License as published by the Free Software 8.="- .-=="i,     .._ License as published by the Free Software
9 - .   .-<_>     .<> Foundation; version 2 of the License. 9 - .   .-<_>     .<> Foundation; version 2 of the License.
10     ._= =}       : 10     ._= =}       :
11    .%+i>       _;_. 11    .%+i>       _;_.
12    .i_,=:_.      -<s. This library is distributed in the hope that 12    .i_,=:_.      -<s. This library is distributed in the hope that
13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
14    : ..    .:,     . . . without even the implied warranty of 14    : ..    .:,     . . . without even the implied warranty of
15    =_        +     =;=| MERCHANTABILITY or FITNESS FOR A 15    =_        +     =;=| MERCHANTABILITY or FITNESS FOR A
16  _.=:.       :    :=>: PARTICULAR PURPOSE. See the GNU 16  _.=:.       :    :=>: PARTICULAR PURPOSE. See the GNU
17..}^=.=       =       ; Library General Public License for more 17..}^=.=       =       ; Library General Public License for more
18++=   -.     .     .: details. 18++=   -.     .     .: details.
19 :     =  ...= . :.=- 19 :     =  ...= . :.=-
20 -.   .:....=;==+<; You should have received a copy of the GNU 20 -.   .:....=;==+<; You should have received a copy of the GNU
21  -_. . .   )=.  = Library General Public License along with 21  -_. . .   )=.  = Library General Public License along with
22   --        :-= this library; see the file COPYING.LIB. 22   --        :-= this library; see the file COPYING.LIB.
23 If not, write to the Free Software Foundation, 23 If not, write to the Free Software Foundation,
24 Inc., 59 Temple Place - Suite 330, 24 Inc., 59 Temple Place - Suite 330,
25 Boston, MA 02111-1307, USA. 25 Boston, MA 02111-1307, USA.
26 26
27*/ 27*/
28/* 28/*
29 * The Infrared OBEX handling class implementation 29 * The Infrared OBEX handling class implementation
30 */ 30 */
31 31
32#include "obex.h" 32#include "obex.h"
33 33
34/* OPIE */ 34/* OPIE */
35#include <opie2/oprocess.h> 35#include <opie2/oprocess.h>
36#include <opie2/odebug.h> 36#include <opie2/odebug.h>
37 37
38/* QT */ 38/* QT */
39#include <qfileinfo.h> 39#include <qfileinfo.h>
40 40
41 41
42 42
43using namespace OpieObex; 43using namespace OpieObex;
44 44
45using namespace Opie::Core; 45using namespace Opie::Core;
46/* TRANSLATOR OpieObex::Obex */ 46/* TRANSLATOR OpieObex::Obex */
47 47
48Obex::Obex( QObject *parent, const char* name ) 48Obex::Obex( QObject *parent, const char* name )
49 : ObexBase(parent, name ) 49 : ObexBase(parent, name )
50{ 50{
51 m_rec = 0; 51 m_rec = 0;
52 m_send=0; 52 m_send=0;
53}; 53};
54Obex::~Obex() { 54Obex::~Obex() {
55 delete m_rec; 55 delete m_rec;
56 delete m_send; 56 delete m_send;
57} 57}
58void Obex::receive() { 58void Obex::receive() {
59 ObexBase::receive(); 59 ObexBase::receive();
60 m_rec = new OProcess(); 60 m_rec = new ObexServer(OBEX_TRANS_IRDA);
61 *m_rec << "irobex_palm3";
62 // connect to the necessary slots 61 // connect to the necessary slots
63 connect(m_rec, SIGNAL(processExited(Opie::Core::OProcess*) ), 62 connect(m_rec, SIGNAL(processExited(Opie::Core::OProcess*) ),
64 this, SLOT(slotExited(Opie::Core::OProcess*) ) ); 63 this, SLOT(slotExited(Opie::Core::OProcess*) ) );
65 64
66 connect(m_rec, SIGNAL(receivedStdout(Opie::Core::OProcess*, char*, int ) ), 65 connect(m_rec, SIGNAL(receivedStdout(Opie::Core::OProcess*, char*, int ) ),
67 this, SLOT(slotStdOut(Opie::Core::OProcess*, char*, int) ) ); 66 this, SLOT(slotStdOut(Opie::Core::OProcess*, char*, int) ) );
68 67
69 if(!m_rec->start(OProcess::NotifyOnExit, OProcess::AllOutput) ) { 68 if(!m_rec->start(OProcess::NotifyOnExit, OProcess::AllOutput) ) {
70 emit done( false ); 69 emit done( false );
71 delete m_rec; 70 delete m_rec;
72 m_rec = 0; 71 m_rec = 0;
73 } 72 }
74} 73}
75 74
76// if currently receiving stop it send receive 75// if currently receiving stop it send receive
77void Obex::send(const QString& fileName, const QString& addr) { 76void Obex::send(const QString& fileName, const QString& addr) {
78 ObexBase::send(fileName, addr); 77 ObexBase::send(fileName, addr);
79 if (m_rec != 0 ) { 78 if (m_rec != 0 ) {
80 if (m_rec->isRunning() ) { 79 if (m_rec->isRunning() ) {
81 emit error(-1 ); 80 emit error(-1 );
82 delete m_rec; 81 delete m_rec;
83 m_rec = 0; 82 m_rec = 0;
84 83
85 }else{ 84 }else{
86 emit error( -1 ); // we did not delete yet but it's not running slotExited is pending 85 emit error( -1 ); // we did not delete yet but it's not running slotExited is pending
87 return; 86 return;
88 } 87 }
89 } 88 }
90 sendNow(); 89 sendNow();
91} 90}
92void Obex::sendNow(){ 91void Obex::sendNow(){
93 if ( m_count >= 25 ) { // could not send 92 if ( m_count >= 25 ) { // could not send
94 emit error(-1 ); 93 emit error(-1 );
95 emit sent(false); 94 emit sent(false);
96 return; 95 return;
97 } 96 }
98 // OProcess inititialisation 97 // OProcess inititialisation
99 m_send = new OProcess(); 98 m_send = new OProcess();
100 m_send->setWorkingDirectory( QFileInfo(m_file).dirPath(true) ); 99 m_send->setWorkingDirectory( QFileInfo(m_file).dirPath(true) );
101 100
102 *m_send << "irobex_palm3"; 101 *m_send << "irobex_palm3";
103 *m_send << QFile::encodeName(QFileInfo(m_file).fileName()); 102 *m_send << QFile::encodeName(QFileInfo(m_file).fileName());
104 103
105 // connect to slots Exited and and StdOut 104 // connect to slots Exited and and StdOut
106 connect(m_send, SIGNAL(processExited(Opie::Core::OProcess*) ), 105 connect(m_send, SIGNAL(processExited(Opie::Core::OProcess*) ),
107 this, SLOT(slotExited(Opie::Core::OProcess*)) ); 106 this, SLOT(slotExited(Opie::Core::OProcess*)) );
108 connect(m_send, SIGNAL(receivedStdout(Opie::Core::OProcess*, char*, int )), 107 connect(m_send, SIGNAL(receivedStdout(Opie::Core::OProcess*, char*, int )),
109 this, SLOT(slotStdOut(Opie::Core::OProcess*, char*, int) ) ); 108 this, SLOT(slotStdOut(Opie::Core::OProcess*, char*, int) ) );
110 109
111 // now start it 110 // now start it
112 if (!m_send->start(/*OProcess::NotifyOnExit, OProcess::AllOutput*/ ) ) { 111 if (!m_send->start(/*OProcess::NotifyOnExit, OProcess::AllOutput*/ ) ) {
113 m_count = 25; 112 m_count = 25;
114 emit error(-1 ); 113 emit error(-1 );
115 delete m_send; 114 delete m_send;
116 m_send=0; 115 m_send=0;
117 } 116 }
118 // end 117 // end
119 m_count++; 118 m_count++;
120 emit currentTry( m_count ); 119 emit currentTry( m_count );
121} 120}
122 121
123void Obex::slotExited(OProcess* proc ){ 122void Obex::slotExited(OProcess* proc ){
124 if (proc == m_rec ) // receive process 123 if (proc == m_rec ) // receive process
125 received(); 124 received();
126 else if ( proc == m_send ) 125 else if ( proc == m_send )
127 sendEnd(); 126 sendEnd();
128 127
129} 128}
130void Obex::slotStdOut(OProcess* proc, char* buf, int len){ 129void Obex::slotStdOut(OProcess* proc, char* buf, int len){
131 if ( proc == m_rec ) { // only receive 130 if ( proc == m_rec ) { // only receive
132 QByteArray ar( len ); 131 QByteArray ar( len );
133 memcpy( ar.data(), buf, len ); 132 memcpy( ar.data(), buf, len );
134 m_outp.append( ar ); 133 m_outp.append( ar );
135 } 134 }
136} 135}
137 136
138void Obex::received() { 137void Obex::received() {
139 if (m_rec->normalExit() ) { 138 if (m_rec->normalExit() ) {
140 if ( m_rec->exitStatus() == 0 ) { // we got one 139 if ( m_rec->exitStatus() == 0 ) { // we got one
141 QString filename = parseOut(); 140 QString filename = parseOut();
142 emit receivedFile( filename ); 141 emit receivedFile( filename );
143 } 142 }
144 }else{ 143 }else{
145 emit done(false); 144 emit done(false);
146 }; 145 };
147 delete m_rec; 146 delete m_rec;
148 m_rec = 0; 147 m_rec = 0;
149 receive(); 148 receive();
150} 149}
151 150
152void Obex::sendEnd() { 151void Obex::sendEnd() {
153 if (m_send->normalExit() ) { 152 if (m_send->normalExit() ) {
154 if ( m_send->exitStatus() == 0 ) { 153 if ( m_send->exitStatus() == 0 ) {
155 delete m_send; 154 delete m_send;
156 m_send=0; 155 m_send=0;
157 emit sent(true); 156 emit sent(true);
diff --git a/core/obex/obex.h b/core/obex/obex.h
index 36ff29a..b948ce4 100644
--- a/core/obex/obex.h
+++ b/core/obex/obex.h
@@ -1,114 +1,115 @@
1/* 1/*
2               =. This file is part of the OPIE Project 2               =. This file is part of the OPIE Project
3             .=l. Copyright (c) 2002 Maximilian Reiss <max.reiss@gmx.de> 3             .=l. Copyright (c) 2002 Maximilian Reiss <max.reiss@gmx.de>
4           .>+-= 4           .>+-=
5 _;:,     .>    :=|. This library is free software; you can 5 _;:,     .>    :=|. This library is free software; you can
6.> <,   >  .   <= redistribute it and/or modify it under 6.> <,   >  .   <= redistribute it and/or modify it under
7:=1 )Y*s>-.--   : the terms of the GNU Library General Public 7:=1 )Y*s>-.--   : the terms of the GNU Library General Public
8.="- .-=="i,     .._ License as published by the Free Software 8.="- .-=="i,     .._ License as published by the Free Software
9 - .   .-<_>     .<> Foundation; version 2 of the License. 9 - .   .-<_>     .<> Foundation; version 2 of the License.
10     ._= =}       : 10     ._= =}       :
11    .%+i>       _;_. 11    .%+i>       _;_.
12    .i_,=:_.      -<s. This library is distributed in the hope that 12    .i_,=:_.      -<s. This library is distributed in the hope that
13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
14    : ..    .:,     . . . without even the implied warranty of 14    : ..    .:,     . . . without even the implied warranty of
15    =_        +     =;=| MERCHANTABILITY or FITNESS FOR A 15    =_        +     =;=| MERCHANTABILITY or FITNESS FOR A
16  _.=:.       :    :=>: PARTICULAR PURPOSE. See the GNU 16  _.=:.       :    :=>: PARTICULAR PURPOSE. See the GNU
17..}^=.=       =       ; Library General Public License for more 17..}^=.=       =       ; Library General Public License for more
18++=   -.     .     .: details. 18++=   -.     .     .: details.
19 :     =  ...= . :.=- 19 :     =  ...= . :.=-
20 -.   .:....=;==+<; You should have received a copy of the GNU 20 -.   .:....=;==+<; You should have received a copy of the GNU
21  -_. . .   )=.  = Library General Public License along with 21  -_. . .   )=.  = Library General Public License along with
22   --        :-= this library; see the file COPYING.LIB. 22   --        :-= this library; see the file COPYING.LIB.
23 If not, write to the Free Software Foundation, 23 If not, write to the Free Software Foundation,
24 Inc., 59 Temple Place - Suite 330, 24 Inc., 59 Temple Place - Suite 330,
25 Boston, MA 02111-1307, USA. 25 Boston, MA 02111-1307, USA.
26 26
27*/ 27*/
28/* 28/*
29 * The Infrared OBEX handling class declaration 29 * The Infrared OBEX handling class declaration
30 */ 30 */
31 31
32#ifndef OpieObex_H 32#ifndef OpieObex_H
33#define OpieObex_H 33#define OpieObex_H
34 34
35#include "obexbase.h" 35#include "obexbase.h"
36#include <qobject.h> 36#include <qobject.h>
37#include "obexserver.h"
37 38
38namespace Opie {namespace Core {class OProcess;}} 39namespace Opie {namespace Core {class OProcess;}}
39class QCopChannel; 40class QCopChannel;
40namespace OpieObex { 41namespace OpieObex {
41 class Obex : public ObexBase { 42 class Obex : public ObexBase {
42 Q_OBJECT 43 Q_OBJECT
43 public: 44 public:
44 /** 45 /**
45 * Obex c'tor look 46 * Obex c'tor look
46 */ 47 */
47 Obex( QObject *parent, const char* name); 48 Obex( QObject *parent, const char* name);
48 /** 49 /**
49 * d'tor 50 * d'tor
50 */ 51 */
51 ~Obex(); 52 ~Obex();
52 53
53 /** 54 /**
54 * Starting listening to irda after enabled by the applet 55 * Starting listening to irda after enabled by the applet
55 * a signal gets emitted when received a file 56 * a signal gets emitted when received a file
56 */ 57 */
57 virtual void receive(); 58 virtual void receive();
58 virtual void send(const QString& filename, const QString& addr); 59 virtual void send(const QString& filename, const QString& addr);
59 virtual void setReceiveEnabled( bool = false ); 60 virtual void setReceiveEnabled( bool = false );
60 signals: 61 signals:
61 62
62 /** 63 /**
63 * a signal 64 * a signal
64 * @param path The path to the received file 65 * @param path The path to the received file
65 */ 66 */
66 void receivedFile( const QString& path); 67 void receivedFile( const QString& path);
67 /** 68 /**
68 * error signal if the program couldn't be started or the 69 * error signal if the program couldn't be started or the
69 * the connection timed out 70 * the connection timed out
70 */ 71 */
71 void error( int ); 72 void error( int );
72 /** 73 /**
73 * The current try to receive data 74 * The current try to receive data
74 */ 75 */
75 void currentTry(unsigned int); 76 void currentTry(unsigned int);
76 /** 77 /**
77 * signal sent The file got beamed to the remote location 78 * signal sent The file got beamed to the remote location
78 */ 79 */
79 void sent(bool); 80 void sent(bool);
80 void done(bool); 81 void done(bool);
81 82
82 private: 83 private:
83 uint m_count; 84 uint m_count;
84 QString m_file; 85 QString m_file;
85 QString m_outp; 86 QString m_outp;
86 Opie::Core::OProcess *m_send; 87 Opie::Core::OProcess *m_send;
87 Opie::Core::OProcess *m_rec; 88 ObexServer* m_rec; //The OBEX server
88 bool m_receive : 1; 89 bool m_receive : 1;
89 void shutDownReceive(); 90 void shutDownReceive();
90 91
91private slots: 92private slots:
92 93
93 /** 94 /**
94 * send over palm obex 95 * send over palm obex
95 */ 96 */
96 97
97 //void send(const QString&); 98 //void send(const QString&);
98 99
99 // the process exited 100 // the process exited
100 void slotExited(Opie::Core::OProcess* proc) ; 101 void slotExited(Opie::Core::OProcess* proc) ;
101 void slotStdOut(Opie::Core::OProcess*, char*, int); 102 void slotStdOut(Opie::Core::OProcess*, char*, int);
102 virtual void slotError(); 103 virtual void slotError();
103 104
104 private: 105 private:
105 void sendNow(); 106 void sendNow();
106 QString parseOut(); 107 QString parseOut();
107 void received(); 108 void received();
108 void sendEnd(); 109 void sendEnd();
109 110
110 }; 111 };
111}; 112};
112 113
113 114
114#endif 115#endif
diff --git a/core/obex/obexserver.cpp b/core/obex/obexserver.cpp
index 95196de..25d8224 100644
--- a/core/obex/obexserver.cpp
+++ b/core/obex/obexserver.cpp
@@ -1,149 +1,150 @@
1/* 1/*
2               =. This file is part of the OPIE Project 2               =. This file is part of the OPIE Project
3             .=l. Copyright (c) 2002 Maximilian Reiss <max.reiss@gmx.de> 3             .=l. Copyright (c) 2002 Maximilian Reiss <max.reiss@gmx.de>
4           .>+-= 4           .>+-=
5 _;:,     .>    :=|. This library is free software; you can 5 _;:,     .>    :=|. This library is free software; you can
6.> <,   >  .   <= redistribute it and/or modify it under 6.> <,   >  .   <= redistribute it and/or modify it under
7:=1 )Y*s>-.--   : the terms of the GNU Library General Public 7:=1 )Y*s>-.--   : the terms of the GNU Library General Public
8.="- .-=="i,     .._ License as published by the Free Software 8.="- .-=="i,     .._ License as published by the Free Software
9 - .   .-<_>     .<> Foundation; version 2 of the License. 9 - .   .-<_>     .<> Foundation; version 2 of the License.
10     ._= =}       : 10     ._= =}       :
11    .%+i>       _;_. 11    .%+i>       _;_.
12    .i_,=:_.      -<s. This library is distributed in the hope that 12    .i_,=:_.      -<s. This library is distributed in the hope that
13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
14    : ..    .:,     . . . without even the implied warranty of 14    : ..    .:,     . . . without even the implied warranty of
15    =_        +     =;=| MERCHANTABILITY or FITNESS FOR A 15    =_        +     =;=| MERCHANTABILITY or FITNESS FOR A
16  _.=:.       :    :=>: PARTICULAR PURPOSE. See the GNU 16  _.=:.       :    :=>: PARTICULAR PURPOSE. See the GNU
17..}^=.=       =       ; Library General Public License for more 17..}^=.=       =       ; Library General Public License for more
18++=   -.     .     .: details. 18++=   -.     .     .: details.
19 :     =  ...= . :.=- 19 :     =  ...= . :.=-
20 -.   .:....=;==+<; You should have received a copy of the GNU 20 -.   .:....=;==+<; You should have received a copy of the GNU
21  -_. . .   )=.  = Library General Public License along with 21  -_. . .   )=.  = Library General Public License along with
22   --        :-= this library; see the file COPYING.LIB. 22   --        :-= this library; see the file COPYING.LIB.
23 If not, write to the Free Software Foundation, 23 If not, write to the Free Software Foundation,
24 Inc., 59 Temple Place - Suite 330, 24 Inc., 59 Temple Place - Suite 330,
25 Boston, MA 02111-1307, USA. 25 Boston, MA 02111-1307, USA.
26 26
27*/ 27*/
28/* 28/*
29 * The OBEX server class implementation 29 * The OBEX server class implementation
30 * Based on OBEX server from GPE (thanks, guys) 30 * Based on OBEX server from GPE (thanks, guys)
31 */ 31 */
32 32
33#include "obexserver.h" 33#include "obexserver.h"
34#include <unistd.h> 34#include <unistd.h>
35#include <opie2/odebug.h> 35#include <opie2/odebug.h>
36#include <sys/types.h> 36#include <sys/types.h>
37#include <sys/wait.h> 37#include <sys/wait.h>
38#include <errno.h> 38#include <errno.h>
39#include <stdlib.h> 39#include <stdlib.h>
40#include <stdio.h> 40#include <stdio.h>
41#include <fcntl.h> 41#include <fcntl.h>
42#include <qapplication.h> 42#include <qapplication.h>
43#include <opie2/oprocctrl.h> 43#include <opie2/oprocctrl.h>
44#include <qstring.h> 44#include <qstring.h>
45#include <qfile.h> 45#include <qfile.h>
46 46
47using namespace Opie::Core; 47using namespace Opie::Core;
48using namespace Opie::Core::Internal; 48using namespace Opie::Core::Internal;
49using namespace OpieObex; 49using namespace OpieObex;
50 50
51ObexServer::ObexServer() : 51ObexServer::ObexServer(int trans) :
52 OProcess(tr("ObexServer"), 0, "ObexServer") 52 OProcess(tr("ObexServer"), 0, "ObexServer")
53{ 53{
54 transport = trans;
54 m_obex = NULL; 55 m_obex = NULL;
55} 56}
56 57
57ObexServer::~ObexServer() 58ObexServer::~ObexServer()
58{ 59{
59 stop(); 60 stop();
60} 61}
61 62
62/** 63/**
63 * Function handles the file received 64 * Function handles the file received
64 * @param name the file name 65 * @param name the file name
65 * @param data the file data 66 * @param data the file data
66 * @param data_len the data length 67 * @param data_len the data length
67 * @return 0 on success -1 on error 68 * @return 0 on success -1 on error
68 */ 69 */
69static int file_received(uint8_t* name, const uint8_t* data, size_t data_len) 70static int file_received(uint8_t* name, const uint8_t* data, size_t data_len)
70{ 71{
71 QString path("/tmp/"); 72 QString path("/tmp/");
72 path += (char*)name; 73 path += (char*)name;
73 QFile out(path); 74 QFile out(path);
74 int err = 0; 75 int err = 0;
75 76
76 if (!out.open(IO_Raw | IO_ReadWrite | IO_Truncate)) { 77 if (!out.open(IO_Raw | IO_ReadWrite | IO_Truncate)) {
77 printf("File %s open error %d\n", (const char*)path, errno); 78 printf("File %s open error %d\n", (const char*)path, errno);
78 err = -1; 79 err = -1;
79 goto out; 80 goto out;
80 } 81 }
81 if (out.writeBlock((const char*)data, data_len) < 0) { 82 if (out.writeBlock((const char*)data, data_len) < 0) {
82 printf("File %s write error %d\n", (const char*)path, errno); 83 printf("File %s write error %d\n", (const char*)path, errno);
83 err = -1; 84 err = -1;
84 goto out; 85 goto out;
85 } 86 }
86out: 87out:
87 out.close(); 88 out.close();
88 if (err == 0) { 89 if (err == 0) {
89 printf("Wrote %s (%d bytes)\n", (const char*)path, data_len); 90 printf("Wrote %s (%d bytes)\n", (const char*)path, data_len);
90 fflush(stdout); 91 fflush(stdout);
91 } 92 }
92 return err; 93 return err;
93} 94}
94 95
95/** 96/**
96 * Function handles the situation when the PUT request has been done 97 * Function handles the situation when the PUT request has been done
97 * @param handle OBEX connection handle 98 * @param handle OBEX connection handle
98 * @param object OBEX object itself 99 * @param object OBEX object itself
99 */ 100 */
100static int put_done(obex_t* handle, obex_object_t* object) 101static int put_done(obex_t* handle, obex_object_t* object)
101{ 102{
102 obex_headerdata_t hv; //Received file header 103 obex_headerdata_t hv; //Received file header
103 uint8_t hi; //Type of the request 104 uint8_t hi; //Type of the request
104 uint32_t hlen; //File (file name) length 105 uint32_t hlen; //File (file name) length
105 int err = 0; 106 int err = 0;
106 107
107 const uint8_t *body = NULL; 108 const uint8_t *body = NULL;
108 int body_len = 0; 109 int body_len = 0;
109 uint8_t* name = NULL; 110 uint8_t* name = NULL;
110 111
111 while (OBEX_ObjectGetNextHeader (handle, object, &hi, &hv, &hlen)) { 112 while (OBEX_ObjectGetNextHeader (handle, object, &hi, &hv, &hlen)) {
112 switch(hi) { 113 switch(hi) {
113 case OBEX_HDR_BODY: 114 case OBEX_HDR_BODY:
114 body = hv.bs; 115 body = hv.bs;
115 body_len = hlen; 116 body_len = hlen;
116 break; 117 break;
117 118
118 case OBEX_HDR_NAME: 119 case OBEX_HDR_NAME:
119 name = new uint8_t[(hlen / 2) + 1]; 120 name = new uint8_t[(hlen / 2) + 1];
120 OBEX_UnicodeToChar(name, hv.bs, hlen); 121 OBEX_UnicodeToChar(name, hv.bs, hlen);
121 break; 122 break;
122 123
123 default: 124 default:
124 break; 125 break;
125 } 126 }
126 } 127 }
127 128
128 if (body) 129 if (body)
129 err = file_received(name, body, body_len); 130 err = file_received(name, body, body_len);
130 131
131 if (name) 132 if (name)
132 delete[] name; 133 delete[] name;
133 return err; 134 return err;
134} 135}
135 136
136/** 137/**
137 * Function handles OBEX request 138 * Function handles OBEX request
138 * @param handle OBEX connection handle 139 * @param handle OBEX connection handle
139 * @param object OBEX object itself 140 * @param object OBEX object itself
140 * @param mode 141 * @param mode
141 * @param event event code 142 * @param event event code
142 * @param cmd OBEX command itself 143 * @param cmd OBEX command itself
143 */ 144 */
144static void handle_request (obex_t* handle, obex_object_t* object, 145static void handle_request (obex_t* handle, obex_object_t* object,
145 int event, int cmd) 146 int event, int cmd)
146{ 147{
147 (void)event; 148 (void)event;
148 switch(cmd){ 149 switch(cmd){
149 case OBEX_CMD_SETPATH: 150 case OBEX_CMD_SETPATH:
@@ -236,205 +237,208 @@ static void obex_event (obex_t* handle, obex_object_t* object, int mode,
236 obex_conn_event(handle, object, mode, event, obex_cmd, obex_rsp); 237 obex_conn_event(handle, object, mode, event, obex_cmd, obex_rsp);
237 } 238 }
238} 239}
239 240
240/** 241/**
241 * Function registers OBEX push service on a specified channel 242 * Function registers OBEX push service on a specified channel
242 * Based on The same function from GPE. 243 * Based on The same function from GPE.
243 * @param session SDP session 244 * @param session SDP session
244 * @param chan channel to listen 245 * @param chan channel to listen
245 * @name name to show 246 * @name name to show
246 */ 247 */
247sdp_session_t* ObexServer::addOpushSvc(uint8_t chan, const char* name) 248sdp_session_t* ObexServer::addOpushSvc(uint8_t chan, const char* name)
248{ 249{
249 sdp_list_t *svclass_id, *pfseq, *apseq, *root; 250 sdp_list_t *svclass_id, *pfseq, *apseq, *root;
250 uuid_t root_uuid, opush_uuid, l2cap_uuid, rfcomm_uuid, obex_uuid; 251 uuid_t root_uuid, opush_uuid, l2cap_uuid, rfcomm_uuid, obex_uuid;
251 sdp_profile_desc_t profile[1]; 252 sdp_profile_desc_t profile[1];
252 sdp_list_t *aproto, *proto[3]; 253 sdp_list_t *aproto, *proto[3];
253 sdp_record_t record; 254 sdp_record_t record;
254 sdp_data_t *channel; 255 sdp_data_t *channel;
255 uint8_t formats[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 }; 256 uint8_t formats[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
256 //uint8_t formats[] = { 0xff }; 257 //uint8_t formats[] = { 0xff };
257 void *dtds[sizeof(formats)], *values[sizeof(formats)]; 258 void *dtds[sizeof(formats)], *values[sizeof(formats)];
258 unsigned int i; 259 unsigned int i;
259 uint8_t dtd = SDP_UINT8; 260 uint8_t dtd = SDP_UINT8;
260 sdp_data_t *sflist; 261 sdp_data_t *sflist;
261 int err = 0; 262 int err = 0;
262 sdp_session_t* lsession = 0; 263 sdp_session_t* lsession = 0;
263 264
264 memset((void *)&record, 0, sizeof(sdp_record_t)); 265 memset((void *)&record, 0, sizeof(sdp_record_t));
265 record.handle = 0xffffffff; 266 record.handle = 0xffffffff;
266 sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP); 267 sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
267 root = sdp_list_append(0, &root_uuid); 268 root = sdp_list_append(0, &root_uuid);
268 sdp_set_browse_groups(&record, root); 269 sdp_set_browse_groups(&record, root);
269 270
270 sdp_uuid16_create(&opush_uuid, OBEX_OBJPUSH_SVCLASS_ID); 271 sdp_uuid16_create(&opush_uuid, OBEX_OBJPUSH_SVCLASS_ID);
271 svclass_id = sdp_list_append(0, &opush_uuid); 272 svclass_id = sdp_list_append(0, &opush_uuid);
272 sdp_set_service_classes(&record, svclass_id); 273 sdp_set_service_classes(&record, svclass_id);
273 274
274 sdp_uuid16_create(&profile[0].uuid, OBEX_OBJPUSH_PROFILE_ID); 275 sdp_uuid16_create(&profile[0].uuid, OBEX_OBJPUSH_PROFILE_ID);
275 profile[0].version = 0x0100; 276 profile[0].version = 0x0100;
276 pfseq = sdp_list_append(0, profile); 277 pfseq = sdp_list_append(0, profile);
277 sdp_set_profile_descs(&record, pfseq); 278 sdp_set_profile_descs(&record, pfseq);
278 279
279 sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID); 280 sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);
280 proto[0] = sdp_list_append(0, &l2cap_uuid); 281 proto[0] = sdp_list_append(0, &l2cap_uuid);
281 apseq = sdp_list_append(0, proto[0]); 282 apseq = sdp_list_append(0, proto[0]);
282 283
283 sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID); 284 sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID);
284 proto[1] = sdp_list_append(0, &rfcomm_uuid); 285 proto[1] = sdp_list_append(0, &rfcomm_uuid);
285 channel = sdp_data_alloc(SDP_UINT8, &chan); 286 channel = sdp_data_alloc(SDP_UINT8, &chan);
286 proto[1] = sdp_list_append(proto[1], channel); 287 proto[1] = sdp_list_append(proto[1], channel);
287 apseq = sdp_list_append(apseq, proto[1]); 288 apseq = sdp_list_append(apseq, proto[1]);
288 289
289 sdp_uuid16_create(&obex_uuid, OBEX_UUID); 290 sdp_uuid16_create(&obex_uuid, OBEX_UUID);
290 proto[2] = sdp_list_append(0, &obex_uuid); 291 proto[2] = sdp_list_append(0, &obex_uuid);
291 apseq = sdp_list_append(apseq, proto[2]); 292 apseq = sdp_list_append(apseq, proto[2]);
292 293
293 aproto = sdp_list_append(0, apseq); 294 aproto = sdp_list_append(0, apseq);
294 sdp_set_access_protos(&record, aproto); 295 sdp_set_access_protos(&record, aproto);
295 296
296 for (i = 0; i < sizeof(formats); i++) 297 for (i = 0; i < sizeof(formats); i++)
297 { 298 {
298 dtds[i] = &dtd; 299 dtds[i] = &dtd;
299 values[i] = &formats[i]; 300 values[i] = &formats[i];
300 } 301 }
301 sflist = sdp_seq_alloc(dtds, values, sizeof(formats)); 302 sflist = sdp_seq_alloc(dtds, values, sizeof(formats));
302 sdp_attr_add(&record, SDP_ATTR_SUPPORTED_FORMATS_LIST, sflist); 303 sdp_attr_add(&record, SDP_ATTR_SUPPORTED_FORMATS_LIST, sflist);
303 304
304 sdp_set_info_attr(&record, name, 0, 0); 305 sdp_set_info_attr(&record, name, 0, 0);
305 306
306 // connect to the local SDP server, register the service record, and 307 // connect to the local SDP server, register the service record, and
307 // disconnect 308 // disconnect
308 lsession = sdp_connect(BDADDR_ANY, BDADDR_LOCAL, SDP_RETRY_IF_BUSY); 309 lsession = sdp_connect(BDADDR_ANY, BDADDR_LOCAL, SDP_RETRY_IF_BUSY);
309 if (lsession == NULL) 310 if (lsession == NULL)
310 goto errout; 311 goto errout;
311 err = sdp_record_register(lsession, &record, 0); 312 err = sdp_record_register(lsession, &record, 0);
312 if (err) { 313 if (err) {
313 sdp_close(lsession); 314 sdp_close(lsession);
314 lsession = NULL; 315 lsession = NULL;
315 } 316 }
316errout: 317errout:
317 sdp_data_free(channel); 318 sdp_data_free(channel);
318 sdp_list_free(proto[0], 0); 319 sdp_list_free(proto[0], 0);
319 sdp_list_free(proto[1], 0); 320 sdp_list_free(proto[1], 0);
320 sdp_list_free(proto[2], 0); 321 sdp_list_free(proto[2], 0);
321 sdp_list_free(apseq, 0); 322 sdp_list_free(apseq, 0);
322 sdp_list_free(aproto, 0); 323 sdp_list_free(aproto, 0);
323 324
324 return lsession; 325 return lsession;
325} 326}
326 327
327int ObexServer::initObex(void) 328int ObexServer::initObex(void)
328{ 329{
329 int channel = 10; //Channel on which we do listen 330 int channel = 10; //Channel on which we do listen
330 if (m_obex) 331 if (m_obex)
331 return 0; 332 return 0;
332 m_obex = ::OBEX_Init(OBEX_TRANS_BLUETOOTH, obex_event, 0); 333 m_obex = ::OBEX_Init(transport, obex_event, 0);
333 if (!m_obex) { 334 if (!m_obex) {
334 printf("OBEX initialization error %d\n", errno); 335 printf("OBEX initialization error %d\n", errno);
335 return -1; 336 return -1;
336 } 337 }
337 ::BtOBEX_ServerRegister(m_obex, NULL, channel); 338 if (transport == OBEX_TRANS_BLUETOOTH) {
338 m_session = addOpushSvc(channel, "OBEX push service"); 339 ::BtOBEX_ServerRegister(m_obex, NULL, channel);
339 if (!m_session) { 340 m_session = addOpushSvc(channel, "OBEX push service");
340 printf("OBEX registration error %d\n", errno); 341 if (!m_session) {
341 ::OBEX_Cleanup(m_obex); 342 printf("OBEX registration error %d\n", errno);
342 m_obex = NULL; 343 ::OBEX_Cleanup(m_obex);
343 return -1; 344 m_obex = NULL;
344 } 345 return -1;
346 }
347 } else if (transport == OBEX_TRANS_IRDA)
348 ::IrOBEX_ServerRegister(m_obex, "OBEX");
345 return 0; 349 return 0;
346} 350}
347 351
348bool ObexServer::start(RunMode runmode, Communication comm) 352bool ObexServer::start(RunMode runmode, Communication comm)
349{ 353{
350 if ( runs ) 354 if ( runs )
351 { 355 {
352 return false; // cannot start a process that is already running 356 return false; // cannot start a process that is already running
353 // or if no executable has been assigned 357 // or if no executable has been assigned
354 } 358 }
355 run_mode = runmode; 359 run_mode = runmode;
356 status = 0; 360 status = 0;
357 361
358 if ( !setupCommunication( comm ) ) 362 if ( !setupCommunication( comm ) )
359 qWarning( "Could not setup Communication!" ); 363 qWarning( "Could not setup Communication!" );
360 364
361 // We do this in the parent because if we do it in the child process 365 // We do this in the parent because if we do it in the child process
362 // gdb gets confused when the application runs from gdb. 366 // gdb gets confused when the application runs from gdb.
363 uid_t uid = getuid(); 367 uid_t uid = getuid();
364 gid_t gid = getgid(); 368 gid_t gid = getgid();
365#ifdef HAVE_INITGROUPS 369#ifdef HAVE_INITGROUPS
366 370
367 struct passwd *pw = getpwuid( uid ); 371 struct passwd *pw = getpwuid( uid );
368#endif 372#endif
369 373
370 int fd[ 2 ]; 374 int fd[ 2 ];
371 if ( 0 > pipe( fd ) ) 375 if ( 0 > pipe( fd ) )
372 { 376 {
373 fd[ 0 ] = fd[ 1 ] = 0; // Pipe failed.. continue 377 fd[ 0 ] = fd[ 1 ] = 0; // Pipe failed.. continue
374 } 378 }
375 379
376 runs = true; 380 runs = true;
377 381
378 QApplication::flushX(); 382 QApplication::flushX();
379 383
380 // WABA: Note that we use fork() and not vfork() because 384 // WABA: Note that we use fork() and not vfork() because
381 // vfork() has unclear semantics and is not standardized. 385 // vfork() has unclear semantics and is not standardized.
382 pid_ = fork(); 386 pid_ = fork();
383 387
384 if ( 0 == pid_ ) 388 if ( 0 == pid_ )
385 { 389 {
386 if ( fd[ 0 ] ) 390 if ( fd[ 0 ] )
387 close( fd[ 0 ] ); 391 close( fd[ 0 ] );
388 if ( !runPrivileged() ) 392 if ( !runPrivileged() )
389 { 393 {
390 setgid( gid ); 394 setgid( gid );
391#if defined( HAVE_INITGROUPS) 395#if defined( HAVE_INITGROUPS)
392 396
393 if ( pw ) 397 if ( pw )
394 initgroups( pw->pw_name, pw->pw_gid ); 398 initgroups( pw->pw_name, pw->pw_gid );
395#endif 399#endif
396 400
397 setuid( uid ); 401 setuid( uid );
398 } 402 }
399 // The child process 403 // The child process
400 if ( !commSetupDoneC() ) 404 if ( !commSetupDoneC() )
401 qWarning( "Could not finish comm setup in child!" ); 405 qWarning( "Could not finish comm setup in child!" );
402 406
403 setupEnvironment(); 407 setupEnvironment();
404 408
405 // Matthias 409 // Matthias
406 if ( run_mode == DontCare ) 410 if ( run_mode == DontCare )
407 setpgid( 0, 0 ); 411 setpgid( 0, 0 );
408 // restore default SIGPIPE handler (Harri) 412 // restore default SIGPIPE handler (Harri)
409 struct sigaction act; 413 struct sigaction act;
410 sigemptyset( &( act.sa_mask ) ); 414 sigemptyset( &( act.sa_mask ) );
411 sigaddset( &( act.sa_mask ), SIGPIPE ); 415 sigaddset( &( act.sa_mask ), SIGPIPE );
412 act.sa_handler = SIG_DFL; 416 act.sa_handler = SIG_DFL;
413 act.sa_flags = 0; 417 act.sa_flags = 0;
414 sigaction( SIGPIPE, &act, 0L ); 418 sigaction( SIGPIPE, &act, 0L );
415 419
416 // We set the close on exec flag. 420 // We set the close on exec flag.
417 // Closing of fd[1] indicates that the execvp succeeded! 421 // Closing of fd[1] indicates that the execvp succeeded!
418 if ( fd[ 1 ] ) 422 if ( fd[ 1 ] )
419 fcntl( fd[ 1 ], F_SETFD, FD_CLOEXEC ); 423 fcntl( fd[ 1 ], F_SETFD, FD_CLOEXEC );
420 424
421 if (initObex() == 0) { 425 if (initObex() == 0) {
422 do { 426 do {
423 int result; //Connection result 427 int result; //Connection result
424 if ( fd[ 1 ] ) { 428 if ( fd[ 1 ] ) {
425 ::close(fd[1]); 429 ::close(fd[1]);
426 fd[1] = 0; 430 fd[1] = 0;
427 } 431 }
428 if ((result = OBEX_HandleInput(m_obex, 60)) < 0) { 432 if ((result = OBEX_HandleInput(m_obex, 60)) < 0) {
429 if (errno != ECONNRESET) { 433 if (errno != ECONNRESET) {
430 printf("OBEX_HandleInput error %d\n", errno); 434 printf("OBEX_HandleInput error %d\n", errno);
431 fflush(stdout); 435 fflush(stdout);
432 _exit(-1); 436 _exit(-1);
433 } 437 }
434 else 438 else
435 _exit(0); 439 _exit(0);
436 } 440 }
437 } while(1); 441 } while(1);
438 } 442 }
439 char resultByte = 1; 443 char resultByte = 1;
440 if ( fd[ 1 ] ) 444 if ( fd[ 1 ] )
diff --git a/core/obex/obexserver.h b/core/obex/obexserver.h
index 8567105..28577e2 100644
--- a/core/obex/obexserver.h
+++ b/core/obex/obexserver.h
@@ -1,83 +1,85 @@
1/* 1/*
2               =. This file is part of the OPIE Project 2               =. This file is part of the OPIE Project
3             .=l. Copyright (c) 2002 Maximilian Reiss <max.reiss@gmx.de> 3             .=l. Copyright (c) 2002 Maximilian Reiss <max.reiss@gmx.de>
4           .>+-= 4           .>+-=
5 _;:,     .>    :=|. This library is free software; you can 5 _;:,     .>    :=|. This library is free software; you can
6.> <,   >  .   <= redistribute it and/or modify it under 6.> <,   >  .   <= redistribute it and/or modify it under
7:=1 )Y*s>-.--   : the terms of the GNU Library General Public 7:=1 )Y*s>-.--   : the terms of the GNU Library General Public
8.="- .-=="i,     .._ License as published by the Free Software 8.="- .-=="i,     .._ License as published by the Free Software
9 - .   .-<_>     .<> Foundation; version 2 of the License. 9 - .   .-<_>     .<> Foundation; version 2 of the License.
10     ._= =}       : 10     ._= =}       :
11    .%+i>       _;_. 11    .%+i>       _;_.
12    .i_,=:_.      -<s. This library is distributed in the hope that 12    .i_,=:_.      -<s. This library is distributed in the hope that
13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
14    : ..    .:,     . . . without even the implied warranty of 14    : ..    .:,     . . . without even the implied warranty of
15    =_        +     =;=| MERCHANTABILITY or FITNESS FOR A 15    =_        +     =;=| MERCHANTABILITY or FITNESS FOR A
16  _.=:.       :    :=>: PARTICULAR PURPOSE. See the GNU 16  _.=:.       :    :=>: PARTICULAR PURPOSE. See the GNU
17..}^=.=       =       ; Library General Public License for more 17..}^=.=       =       ; Library General Public License for more
18++=   -.     .     .: details. 18++=   -.     .     .: details.
19 :     =  ...= . :.=- 19 :     =  ...= . :.=-
20 -.   .:....=;==+<; You should have received a copy of the GNU 20 -.   .:....=;==+<; You should have received a copy of the GNU
21  -_. . .   )=.  = Library General Public License along with 21  -_. . .   )=.  = Library General Public License along with
22   --        :-= this library; see the file COPYING.LIB. 22   --        :-= this library; see the file COPYING.LIB.
23 If not, write to the Free Software Foundation, 23 If not, write to the Free Software Foundation,
24 Inc., 59 Temple Place - Suite 330, 24 Inc., 59 Temple Place - Suite 330,
25 Boston, MA 02111-1307, USA. 25 Boston, MA 02111-1307, USA.
26 26
27*/ 27*/
28/* 28/*
29 * The OBEX server class declaration 29 * The OBEX server class declaration
30 * Based on OBEX server from GPE (thanks, guys) 30 * Based on OBEX server from GPE (thanks, guys)
31 */ 31 */
32#ifndef ObexServer_H 32#ifndef ObexServer_H
33#define ObexServer_H 33#define ObexServer_H
34 34
35#include <qobject.h> 35#include <qobject.h>
36#include <opie2/oprocess.h> 36#include <opie2/oprocess.h>
37 37
38#include <bluetooth/sdp.h> 38#include <bluetooth/sdp.h>
39#include <bluetooth/sdp_lib.h> 39#include <bluetooth/sdp_lib.h>
40 40
41#include <openobex/obex.h> 41#include <openobex/obex.h>
42 42
43namespace Opie { 43namespace Opie {
44 namespace Core { 44 namespace Core {
45 class OProcess; 45 class OProcess;
46 namespace Internal { 46 namespace Internal {
47 class OProcessController; 47 class OProcessController;
48 } 48 }
49 } 49 }
50}; 50};
51 51
52namespace Opie {namespace Core {class OProcess;}} 52namespace Opie {namespace Core {class OProcess;}}
53namespace OpieObex { 53namespace OpieObex {
54 class ObexServer : public Opie::Core::OProcess { 54 class ObexServer : public Opie::Core::OProcess {
55 Q_OBJECT 55 Q_OBJECT
56 private:
57 int transport; //The OBEX transport type
56 public: 58 public:
57 /** 59 /**
58 * ObexServer constructor 60 * ObexServer constructor
59 */ 61 */
60 ObexServer(); 62 ObexServer(int trans);
61 /** 63 /**
62 * 64 *
63 */ 65 */
64 ~ObexServer(); 66 ~ObexServer();
65 //Function starts the server process 67 //Function starts the server process
66 virtual bool start( RunMode runmode = NotifyOnExit, 68 virtual bool start( RunMode runmode = NotifyOnExit,
67 Communication comm = NoCommunication ); 69 Communication comm = NoCommunication );
68 //Stop the server process 70 //Stop the server process
69 int stop(); 71 int stop();
70 protected: //variables 72 protected: //variables
71 obex_t* m_obex; //Obex server handler 73 obex_t* m_obex; //Obex server handler
72 sdp_session_t* m_session; //SDP session handler; 74 sdp_session_t* m_session; //SDP session handler;
73 protected: //functions 75 protected: //functions
74 //Funtion initializes obex server return 0 on success and -1 on error 76 //Funtion initializes obex server return 0 on success and -1 on error
75 int initObex(void); 77 int initObex(void);
76 //Function registers an OBEX push service 78 //Function registers an OBEX push service
77 sdp_session_t* addOpushSvc(uint8_t chan, const char* name); 79 sdp_session_t* addOpushSvc(uint8_t chan, const char* name);
78 signals: 80 signals:
79 protected slots: 81 protected slots:
80 }; 82 };
81}; 83};
82 84
83#endif 85#endif