Skip to content

Commit 14510ab

Browse files
committed
2 parents 7822cfc + 9fe59dd commit 14510ab

File tree

11 files changed

+98
-29
lines changed

11 files changed

+98
-29
lines changed

example/lib/src/callscreen.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,4 +541,9 @@ class _MyCallScreenWidget extends State<CallScreenWidget>
541541
padding: EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 24.0),
542542
child: Container(width: 320, child: _buildActionButtons())));
543543
}
544+
545+
@override
546+
void onNewMessage(SIPMessageRequest msg) {
547+
// NO OP
548+
}
544549
}

example/lib/src/dialpad.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@ class _MyDialPadWidget extends State<DialPadWidget>
1818
TextEditingController _textController;
1919
SharedPreferences _preferences;
2020

21+
String receivedMsg;
22+
2123
@override
2224
initState() {
2325
super.initState();
26+
receivedMsg = "";
2427
_bindEventListeners();
2528
_loadSettings();
2629
}
@@ -30,6 +33,7 @@ class _MyDialPadWidget extends State<DialPadWidget>
3033
_dest = _preferences.getString('dest') ?? 'sip:[email protected]';
3134
_textController = TextEditingController(text: _dest);
3235
_textController.text = _dest;
36+
3337
this.setState(() {});
3438
}
3539

@@ -247,6 +251,14 @@ class _MyDialPadWidget extends State<DialPadWidget>
247251
style: TextStyle(fontSize: 14, color: Colors.black54),
248252
)),
249253
),
254+
Padding(
255+
padding: const EdgeInsets.all(6.0),
256+
child: Center(
257+
child: Text(
258+
'Received Message: ${receivedMsg}',
259+
style: TextStyle(fontSize: 14, color: Colors.black54),
260+
)),
261+
),
250262
Container(
251263
child: Column(
252264
crossAxisAlignment: CrossAxisAlignment.center,
@@ -270,4 +282,13 @@ class _MyDialPadWidget extends State<DialPadWidget>
270282
Navigator.pushNamed(context, '/callscreen', arguments: call);
271283
}
272284
}
285+
286+
@override
287+
void onNewMessage(SIPMessageRequest msg) {
288+
//Save the incoming message to DB
289+
String msgBody = msg.request.body as String;
290+
setState(() {
291+
receivedMsg = msgBody;
292+
});
293+
}
273294
}

example/lib/src/register.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,4 +301,9 @@ class _MyRegisterWidget extends State<RegisterWidget>
301301

302302
@override
303303
void transportStateChanged(TransportState state) {}
304+
305+
@override
306+
void onNewMessage(SIPMessageRequest msg) {
307+
// NO OP
308+
}
304309
}

lib/src/event_manager/event_manager.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@ import 'call_events.dart';
33
import 'refer_events.dart';
44
import 'register_events.dart';
55
import 'transport_events.dart';
6+
import 'message_events.dart';
67

78
export 'events.dart';
89
export 'call_events.dart';
910
export 'refer_events.dart';
1011
export 'register_events.dart';
1112
export 'transport_events.dart';
13+
export 'message_events.dart';
1214

1315
import '../logger.dart';
1416

lib/src/event_manager/internal_events.dart

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,6 @@ class EventTransactionDestroyed extends EventType {
2424
EventTransactionDestroyed({this.transaction});
2525
}
2626

27-
class EventNewMessage extends EventType {
28-
dynamic request;
29-
String originator;
30-
Message message;
31-
EventNewMessage({this.message, this.originator, this.request});
32-
}
33-
3427
class EventSipEvent extends EventType {
3528
IncomingRequest request;
3629
EventSipEvent({this.request});
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import '../message.dart';
2+
import 'events.dart';
3+
4+
class EventNewMessage extends EventType {
5+
dynamic request;
6+
String originator;
7+
Message message;
8+
EventNewMessage({this.message, this.originator, this.request});
9+
}

lib/src/message.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ class Message extends EventManager {
5555
}
5656

5757
// Check target validity.
58-
target = this._ua.normalizeTarget(target);
59-
if (target == null) {
58+
var normalized = this._ua.normalizeTarget(target);
59+
if (normalized == null) {
6060
throw new Exceptions.TypeError('Invalid target: ${originalTarget}');
6161
}
6262

@@ -71,7 +71,7 @@ class Message extends EventManager {
7171
extraHeaders.add('Content-Type: $contentType');
7272

7373
this._request = new SIPMessage.OutgoingRequest(
74-
SipMethod.MESSAGE, target, this._ua, null, extraHeaders);
74+
SipMethod.MESSAGE, normalized, this._ua, null, extraHeaders);
7575
if (body != null) {
7676
this._request.body = body;
7777
}

lib/src/parser.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'dart:convert' show utf8;
12
import '../sip_ua.dart';
23
import 'grammar.dart';
34
import 'sip_message.dart';
@@ -86,7 +87,11 @@ IncomingMessage parseMessage(String data, UA ua) {
8687
if (contentLength is String) {
8788
contentLength = int.tryParse(contentLength) ?? 0;
8889
}
89-
message.body = data.substring(bodyStart, bodyStart + contentLength);
90+
if(contentLength > 0) {
91+
var encoded = utf8.encode(data);
92+
List<int> content = encoded.sublist(bodyStart, bodyStart + contentLength);
93+
message.body = utf8.decode(content);
94+
}
9095
} else {
9196
message.body = data.substring(bodyStart);
9297
}

lib/src/sip_message.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'dart:convert' show utf8;
12
import 'package:sdp_transform/sdp_transform.dart' as sdp_transform;
23

34
import '../sip_ua.dart';
@@ -269,7 +270,10 @@ class OutgoingRequest {
269270
msg += 'User-Agent: ${userAgent}\r\n';
270271

271272
if (this.body != null) {
272-
var length = this.body.length;
273+
logger.debug("Outgoing Message: " + this.body);
274+
//Here we should calculate the real content length for UTF8
275+
var encoded = utf8.encode(this.body);
276+
var length = encoded.length;
273277
msg += 'Content-Length: ${length}\r\n\r\n';
274278
msg += this.body;
275279
} else {

lib/src/sip_ua_helper.dart

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class SIPUAHelper extends EventManager {
8080
return false;
8181
}
8282

83-
Call findCall (String id){
83+
Call findCall(String id) {
8484
return _calls[id];
8585
}
8686

@@ -155,18 +155,29 @@ class SIPUAHelper extends EventManager {
155155
.addAllEventHandlers(_options()['eventHandlers'] as EventManager);
156156
}
157157
_calls[event.id] =
158-
Call(event.id, session, CallStateEnum.CALL_INITIATION);
158+
Call(event.id, session, CallStateEnum.CALL_INITIATION);
159159
_notifyCallStateListeners(
160160
event, CallState(CallStateEnum.CALL_INITIATION));
161161
});
162162

163+
this._ua.on(EventNewMessage(), (EventNewMessage event) {
164+
logger.debug('newMessage => ' + event.toString());
165+
//Only notify incoming message to listener
166+
if (event.message.direction == 'incoming') {
167+
SIPMessageRequest message = new SIPMessageRequest(
168+
event.message, event.originator, event.request);
169+
_notifyNewMessageListeners(message);
170+
}
171+
});
172+
163173
_ua.start();
164174
} catch (event, s) {
165175
logger.error(event.toString(), null, s);
166176
}
167177
}
168-
169-
Map<String, Object> buildCallOptions([bool voiceonly = false]) => _options(voiceonly);
178+
179+
Map<String, Object> buildCallOptions([bool voiceonly = false]) =>
180+
_options(voiceonly);
170181

171182
Map<String, Object> _options([bool voiceonly = false]) {
172183
// Register callbacks to desired call events
@@ -249,19 +260,7 @@ class SIPUAHelper extends EventManager {
249260

250261
var _defaultOptions = {
251262
'eventHandlers': eventHandlers,
252-
'pcConfig': {
253-
'iceServers': [
254-
{'url': 'stun:stun.l.google.com:19302'},
255-
/*
256-
* turn server configuration example.
257-
{
258-
'url': 'turn:123.45.67.89:3478',
259-
'username': 'change_to_real_user',
260-
'credential': 'change_to_real_secret'
261-
},
262-
*/
263-
]
264-
},
263+
'pcConfig': {'iceServers': _uaSettings.iceServers},
265264
'mediaConstraints': {
266265
'audio': true,
267266
'video': voiceonly
@@ -343,6 +342,12 @@ class SIPUAHelper extends EventManager {
343342
listener.callStateChanged(call, state);
344343
});
345344
}
345+
346+
void _notifyNewMessageListeners(SIPMessageRequest msg) {
347+
_sipUaHelperListeners.forEach((listener) {
348+
listener.onNewMessage(msg);
349+
});
350+
}
346351
}
347352

348353
enum CallStateEnum {
@@ -490,10 +495,19 @@ class TransportState {
490495
TransportState(this.state, {this.cause});
491496
}
492497

498+
class SIPMessageRequest {
499+
dynamic request;
500+
String originator;
501+
Message message;
502+
SIPMessageRequest(this.message, this.originator, this.request);
503+
}
504+
493505
abstract class SipUaHelperListener {
494506
void transportStateChanged(TransportState state);
495507
void registrationStateChanged(RegistrationState state);
496508
void callStateChanged(Call call, CallState state);
509+
//For SIP new messaga coming
510+
void onNewMessage(SIPMessageRequest msg);
497511
}
498512

499513
class UaSettings {
@@ -505,4 +519,14 @@ class UaSettings {
505519
String authorizationUser;
506520
String password;
507521
String displayName;
522+
523+
List<Map<String, String>> iceServers = [
524+
{'url': 'stun:stun.l.google.com:19302'},
525+
// turn server configuration example.
526+
// {
527+
// 'url': 'turn:123.45.67.89:3478',
528+
// 'username': 'change_to_real_user',
529+
// 'credential': 'change_to_real_secret'
530+
// },
531+
];
508532
}

0 commit comments

Comments
 (0)