@@ -5,25 +5,19 @@ import 'package:collection/collection.dart' show IterableExtension;
5
5
import 'package:xml/xml.dart' as xml;
6
6
import 'package:synchronized/synchronized.dart' ;
7
7
import 'package:xmpp_stone/src/ReconnectionManager.dart' ;
8
- import 'package:xmpp_stone/src/account/XmppAccountSettings.dart' ;
9
8
10
- import 'package:xmpp_stone/src/data/Jid.dart' ;
11
9
import 'package:xmpp_stone/src/elements/nonzas/Nonza.dart' ;
12
- import 'package:xmpp_stone/src/elements/stanzas/AbstractStanza.dart' ;
13
- import 'package:xmpp_stone/src/extensions/ping/PingManager.dart' ;
14
10
import 'package:xmpp_stone/src/features/ConnectionNegotatiorManager.dart' ;
15
11
import 'package:xmpp_stone/src/features/servicediscovery/CarbonsNegotiator.dart' ;
16
12
import 'package:xmpp_stone/src/features/servicediscovery/MAMNegotiator.dart' ;
17
13
import 'package:xmpp_stone/src/features/servicediscovery/ServiceDiscoveryNegotiator.dart' ;
18
14
import 'package:xmpp_stone/src/features/streammanagement/StreamManagmentModule.dart' ;
19
15
import 'package:xmpp_stone/src/parser/StanzaParser.dart' ;
20
- import 'package:xmpp_stone/src/presence/PresenceManager.dart' ;
21
- import 'package:xmpp_stone/src/roster/RosterManager.dart' ;
22
16
import 'package:xmpp_stone/xmpp_stone.dart' ;
23
17
24
18
import 'connection/XmppWebsocketApi.dart'
25
- if (dart.library.io) 'connection/XmppWebsocketIo.dart'
26
- if (dart.library.html) 'connection/XmppWebsocketHtml.dart' as xmppSocket;
19
+ if (dart.library.io) 'connection/XmppWebsocketIo.dart'
20
+ if (dart.library.html) 'connection/XmppWebsocketHtml.dart' as xmppSocket;
27
21
28
22
import 'logger/Log.dart' ;
29
23
@@ -151,13 +145,7 @@ class Connection {
151
145
}
152
146
153
147
void _openStream () {
154
- var streamOpeningString = """
155
- <?xml version='1.0'?>
156
- <stream:stream xmlns='jabber:client' version='1.0' xmlns:stream='http://etherx.jabber.org/streams'
157
- to='${fullJid .domain }'
158
- xml:lang='en'
159
- >
160
- """ ;
148
+ var streamOpeningString = _socket? .getStreamOpeningElement (fullJid.domain);
161
149
write (streamOpeningString);
162
150
}
163
151
@@ -208,16 +196,22 @@ xml:lang='en'
208
196
connectionNegotatiorManager.init ();
209
197
setState (XmppConnectionState .SocketOpening );
210
198
try {
211
-
212
199
var socket = xmppSocket.createSocket ();
213
200
214
- return await socket.connect (account.host ?? account.domain, account.port, map: prepareStreamResponse).then ((socket) {
201
+ return await socket
202
+ .connect (
203
+ account.host ?? account.domain,
204
+ account.port,
205
+ wsProtocols: account.wsProtocols,
206
+ wsPath: account.wsPath,
207
+ map: prepareStreamResponse,
208
+ )
209
+ .then ((socket) {
215
210
// if not closed in meantime
216
211
if (_state != XmppConnectionState .Closed ) {
217
212
setState (XmppConnectionState .SocketOpened );
218
213
_socket = socket;
219
- socket
220
- .listen (handleResponse, onDone: handleConnectionDone);
214
+ socket.listen (handleResponse, onDone: handleConnectionDone);
221
215
_openStream ();
222
216
} else {
223
217
Log .d (TAG , 'Closed in meantime' );
@@ -251,10 +245,10 @@ xml:lang='en'
251
245
252
246
/// Dispose of the connection so stops all activities and cannot be re-used.
253
247
/// For the connection to be garbage collected.
254
- ///
248
+ ///
255
249
/// If the Connection instance was created with [getInstance] ,
256
250
/// you must also call [Connection.removeInstance] after calling [dispose] .
257
- ///
251
+ ///
258
252
/// If you intend to re-use the connection later, consider just calling [close] instead.
259
253
void dispose () {
260
254
close ();
@@ -309,36 +303,30 @@ xml:lang='en'
309
303
if (fullResponse.isNotEmpty) {
310
304
xml.XmlNode ? xmlResponse;
311
305
try {
312
- xmlResponse = xml.XmlDocument .parse (fullResponse).firstChild;
306
+ xmlResponse = xml.XmlDocument .parse (fullResponse. replaceAll ( '<?xml version= \' 1.0 \' ?>' , '' ) ).firstChild;
313
307
} catch (e) {
314
308
_unparsedXmlResponse += fullResponse.substring (
315
309
0 , fullResponse.length - 13 ); //remove xmpp_stone end tag
316
310
xmlResponse = xml.XmlElement (xml.XmlName ('error' ));
317
311
}
318
- // xmlResponse.descendants.whereType<xml.XmlElement>().forEach((element) {
319
- // Log.d("element: " + element.name.local);
320
- // });
312
+
321
313
//TODO: Improve parser for children only
322
- xmlResponse! .descendants
323
- .whereType< xml.XmlElement > ()
314
+ xmlResponse! .childElements
324
315
.where ((element) => startMatcher (element))
325
316
.forEach ((element) => processInitialStream (element));
326
317
327
- xmlResponse.children
328
- .whereType< xml.XmlElement > ()
318
+ xmlResponse.childElements
329
319
.where ((element) => stanzaMatcher (element))
330
320
.map ((xmlElement) => StanzaParser .parseStanza (xmlElement))
331
321
.forEach ((stanza) => _inStanzaStreamController.add (stanza));
332
322
333
- xmlResponse.descendants
334
- .whereType< xml.XmlElement > ()
323
+ xmlResponse.childElements
335
324
.where ((element) => featureMatcher (element))
336
325
.forEach ((feature) =>
337
326
connectionNegotatiorManager.negotiateFeatureList (feature));
338
327
339
328
//TODO: Probably will introduce bugs!!!
340
- xmlResponse.children
341
- .whereType< xml.XmlElement > ()
329
+ xmlResponse.childElements
342
330
.where ((element) => nonzaMatcher (element))
343
331
.map ((xmlElement) => Nonza .parse (xmlElement))
344
332
.forEach ((nonza) => _inNonzaStreamController.add (nonza));
@@ -405,9 +393,10 @@ xml:lang='en'
405
393
void startSecureSocket () {
406
394
Log .d (TAG , 'startSecureSocket' );
407
395
408
- _socket! .secure (onBadCertificate: _validateBadCertificate).
409
- then ((secureSocket) {
410
- if (secureSocket == null ) return ;
396
+ _socket!
397
+ .secure (onBadCertificate: _validateBadCertificate)
398
+ .then ((secureSocket) {
399
+ if (secureSocket == null ) return ;
411
400
412
401
secureSocket
413
402
.cast <List <int >>()
0 commit comments