-rw-r--r-- | core/launcher/qcopbridge.cpp | 99 | ||||
-rw-r--r-- | core/launcher/qcopbridge.h | 3 |
2 files changed, 99 insertions, 3 deletions
diff --git a/core/launcher/qcopbridge.cpp b/core/launcher/qcopbridge.cpp index f780235..9cb56ce 100644 --- a/core/launcher/qcopbridge.cpp +++ b/core/launcher/qcopbridge.cpp | |||
@@ -26,8 +26,9 @@ | |||
26 | #endif | 26 | #endif |
27 | #include <qtopia/qpeapplication.h> | 27 | #include <qtopia/qpeapplication.h> |
28 | #include <qtopia/global.h> | 28 | #include <qtopia/global.h> |
29 | #include <qtopia/version.h> | 29 | #include <qtopia/version.h> |
30 | #include <qtopia/config.h> | ||
30 | 31 | ||
31 | #include <qdir.h> | 32 | #include <qdir.h> |
32 | #include <qfile.h> | 33 | #include <qfile.h> |
33 | #include <qtextstream.h> | 34 | #include <qtextstream.h> |
@@ -79,8 +80,9 @@ QCopBridge::QCopBridge( Q_UINT16 port, QObject *parent, | |||
79 | #endif | 80 | #endif |
80 | } | 81 | } |
81 | sendSync = FALSE; | 82 | sendSync = FALSE; |
82 | openConnections.setAutoDelete( TRUE ); | 83 | openConnections.setAutoDelete( TRUE ); |
84 | authorizeConnections(); | ||
83 | } | 85 | } |
84 | 86 | ||
85 | QCopBridge::~QCopBridge() | 87 | QCopBridge::~QCopBridge() |
86 | { | 88 | { |
@@ -90,8 +92,11 @@ QCopBridge::~QCopBridge() | |||
90 | } | 92 | } |
91 | 93 | ||
92 | void QCopBridge::authorizeConnections() | 94 | void QCopBridge::authorizeConnections() |
93 | { | 95 | { |
96 | Config cfg("Security"); | ||
97 | cfg.setGroup("SyncMode"); | ||
98 | m_mode = Mode(cfg.readNumEntry("Mode", Sharp )); | ||
94 | QListIterator<QCopBridgePI> it(openConnections); | 99 | QListIterator<QCopBridgePI> it(openConnections); |
95 | while ( it.current() ) { | 100 | while ( it.current() ) { |
96 | if ( !it.current()->verifyAuthorised() ) { | 101 | if ( !it.current()->verifyAuthorised() ) { |
97 | disconnect ( it.current(), SIGNAL( connectionClosed( QCopBridgePI *) ), this, SLOT( closed( QCopBridgePI *) ) ); | 102 | disconnect ( it.current(), SIGNAL( connectionClosed( QCopBridgePI *) ), this, SLOT( closed( QCopBridgePI *) ) ); |
@@ -151,14 +156,100 @@ void QCopBridge::desktopMessage( const QCString &command, const QByteArray &data | |||
151 | sendSync = TRUE; | 156 | sendSync = TRUE; |
152 | startTimer( 20000 ); | 157 | startTimer( 20000 ); |
153 | } | 158 | } |
154 | 159 | ||
160 | if ( m_mode & Qtopia1_7 ) { | ||
161 | // send the command to all open connections | ||
162 | QCopBridgePI *pi; | ||
163 | for ( pi = openConnections.first(); pi != 0; pi = openConnections.next() ) { | ||
164 | pi->sendDesktopMessage( command, data ); | ||
165 | } | ||
166 | } | ||
167 | if ( m_mode & Sharp ) | ||
168 | sendDesktopMessageOld( command, data ); | ||
169 | } | ||
170 | |||
171 | #ifndef OPIE_NO_OLD_SYNC_CODE | ||
172 | /* | ||
173 | * Old compat mode | ||
174 | */ | ||
175 | void QCopBridge::sendDesktopMessageOld( const QCString& command, const QByteArray& args) { | ||
176 | command.stripWhiteSpace(); | ||
177 | |||
178 | int paren = command.find( "(" ); | ||
179 | if ( paren <= 0 ) { | ||
180 | qDebug("DesktopMessage: bad qcop syntax"); | ||
181 | return; | ||
182 | } | ||
183 | |||
184 | QString params = command.mid( paren + 1 ); | ||
185 | if ( params[params.length()-1] != ')' ) { | ||
186 | qDebug("DesktopMessage: bad qcop syntax"); | ||
187 | return; | ||
188 | } | ||
189 | |||
190 | params.truncate( params.length()-1 ); | ||
191 | |||
192 | QStringList paramList = QStringList::split( ",", params ); | ||
193 | QString data; | ||
194 | if ( paramList.count() ) { | ||
195 | QDataStream stream( args, IO_ReadOnly ); | ||
196 | for ( QStringList::Iterator it = paramList.begin(); it != paramList.end(); ++it ) { | ||
197 | QString str; | ||
198 | if ( *it == "QString" ) { | ||
199 | stream >> str; | ||
200 | } else if ( *it == "QCString" ) { | ||
201 | QCString cstr; | ||
202 | stream >> cstr; | ||
203 | str = QString::fromLocal8Bit( cstr ); | ||
204 | } else if ( *it == "int" ) { | ||
205 | int i; | ||
206 | stream >> i; | ||
207 | str = QString::number( i ); | ||
208 | } else if ( *it == "bool" ) { | ||
209 | int i; | ||
210 | stream >> i; | ||
211 | str = QString::number( i ); | ||
212 | } else { | ||
213 | qDebug(" cannot route the argument type %s throught the qcop bridge", (*it).latin1() ); | ||
214 | return; | ||
215 | } | ||
216 | QString estr; | ||
217 | for (int i=0; i<(int)str.length(); i++) { | ||
218 | QChar ch = str[i]; | ||
219 | if ( ch.row() ) | ||
220 | goto quick; | ||
221 | switch (ch.cell()) { | ||
222 | case '&': | ||
223 | estr.append( "&" ); | ||
224 | break; | ||
225 | case ' ': | ||
226 | estr.append( "&0x20;" ); | ||
227 | break; | ||
228 | case '\n': | ||
229 | estr.append( "&0x0d;" ); | ||
230 | break; | ||
231 | case '\r': | ||
232 | estr.append( "&0x0a;" ); | ||
233 | break; | ||
234 | default: quick: | ||
235 | estr.append(ch); | ||
236 | } | ||
237 | } | ||
238 | data += " " + estr; | ||
239 | } | ||
240 | } | ||
241 | QString sendCommand = QString(command.data()) + data; | ||
242 | |||
243 | |||
155 | // send the command to all open connections | 244 | // send the command to all open connections |
156 | QCopBridgePI *pi; | 245 | QCopBridgePI *pi; |
157 | for ( pi = openConnections.first(); pi != 0; pi = openConnections.next() ) { | 246 | for ( pi = openConnections.first(); pi != 0; pi = openConnections.next() ) |
158 | pi->sendDesktopMessage( command, data ); | 247 | pi->sendDesktopMessage( sendCommand ); |
159 | } | 248 | |
160 | } | 249 | } |
250 | #endif | ||
251 | |||
161 | 252 | ||
162 | void QCopBridge::timerEvent( QTimerEvent * ) | 253 | void QCopBridge::timerEvent( QTimerEvent * ) |
163 | { | 254 | { |
164 | sendSync = FALSE; | 255 | sendSync = FALSE; |
@@ -228,15 +319,17 @@ void QCopBridgePI::sendDesktopMessage( const QString &msg ) | |||
228 | void QCopBridgePI::sendDesktopMessage( const QCString &msg, const QByteArray& data ) | 319 | void QCopBridgePI::sendDesktopMessage( const QCString &msg, const QByteArray& data ) |
229 | { | 320 | { |
230 | if ( !isOpen() ) // eg. Forbidden | 321 | if ( !isOpen() ) // eg. Forbidden |
231 | return; | 322 | return; |
323 | |||
232 | const char hdr[]="CALLB QPE/Desktop "; | 324 | const char hdr[]="CALLB QPE/Desktop "; |
233 | writeBlock(hdr,sizeof(hdr)-1); | 325 | writeBlock(hdr,sizeof(hdr)-1); |
234 | writeBlock(msg,msg.length()); | 326 | writeBlock(msg,msg.length()); |
235 | writeBlock(" ",1); | 327 | writeBlock(" ",1); |
236 | QByteArray b64 = Opie::Global::encodeBase64(data); | 328 | QByteArray b64 = Opie::Global::encodeBase64(data); |
237 | writeBlock(b64.data(),b64.size()); | 329 | writeBlock(b64.data(),b64.size()); |
238 | writeBlock("\r\n",2); | 330 | writeBlock("\r\n",2); |
331 | |||
239 | } | 332 | } |
240 | 333 | ||
241 | 334 | ||
242 | void QCopBridgePI::send( const QString& msg ) | 335 | void QCopBridgePI::send( const QString& msg ) |
diff --git a/core/launcher/qcopbridge.h b/core/launcher/qcopbridge.h index bae3f88..9483d9d 100644 --- a/core/launcher/qcopbridge.h +++ b/core/launcher/qcopbridge.h | |||
@@ -36,8 +36,9 @@ class QCopBridge : public QServerSocket | |||
36 | { | 36 | { |
37 | Q_OBJECT | 37 | Q_OBJECT |
38 | 38 | ||
39 | public: | 39 | public: |
40 | enum Mode { Qtopia1_7= 0x01, Sharp = 0x02, Both = Qtopia1_7 | Sharp }; | ||
40 | QCopBridge( Q_UINT16 port, QObject *parent = 0, const char* name = 0 ); | 41 | QCopBridge( Q_UINT16 port, QObject *parent = 0, const char* name = 0 ); |
41 | virtual ~QCopBridge(); | 42 | virtual ~QCopBridge(); |
42 | 43 | ||
43 | void newConnection( int socket ); | 44 | void newConnection( int socket ); |
@@ -52,14 +53,16 @@ signals: | |||
52 | void connectionClosed( const QHostAddress & ); | 53 | void connectionClosed( const QHostAddress & ); |
53 | 54 | ||
54 | protected: | 55 | protected: |
55 | void timerEvent( QTimerEvent * ); | 56 | void timerEvent( QTimerEvent * ); |
57 | void sendDesktopMessageOld( const QCString&, const QByteArray& ); | ||
56 | 58 | ||
57 | private: | 59 | private: |
58 | QCopChannel *desktopChannel; | 60 | QCopChannel *desktopChannel; |
59 | QCopChannel *cardChannel; | 61 | QCopChannel *cardChannel; |
60 | QList<QCopBridgePI> openConnections; | 62 | QList<QCopBridgePI> openConnections; |
61 | bool sendSync; | 63 | bool sendSync; |
64 | Mode m_mode; | ||
62 | }; | 65 | }; |
63 | 66 | ||
64 | 67 | ||
65 | class QCopBridgePI : public QSocket | 68 | class QCopBridgePI : public QSocket |