Skip to content

Commit db68c75

Browse files
committed
Add SIP message listener to listen the new incoming SIP text message
1 parent 04711dc commit db68c75

File tree

11 files changed

+80
-12
lines changed

11 files changed

+80
-12
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
}
@@ -31,6 +34,7 @@ class _MyDialPadWidget extends State<DialPadWidget>
3134
_preferences.getString('dest') ?? 'sip:[email protected]';
3235
_textController = TextEditingController(text: _dest);
3336
_textController.text = _dest;
37+
3438
this.setState(() {});
3539
}
3640

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

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: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,14 @@ class SIPUAHelper extends EventManager {
199199
_notifyCallStateListeners(CallState(CallStateEnum.CALL_INITIATION));
200200
});
201201

202+
this._ua.on(EventNewMessage(), (EventNewMessage event) {
203+
logger.debug('newMessage => ' + event.toString());
204+
//Only notify incoming message to listener
205+
if (event.message.direction == 'incoming') {
206+
SIPMessageRequest message = new SIPMessageRequest(event.message, event.originator, event.request);
207+
_notifyNewMessageListeners(message);
208+
}
209+
});
202210
this._ua.start();
203211
} catch (e, s) {
204212
logger.error(e.toString(), null, s);
@@ -381,6 +389,12 @@ class SIPUAHelper extends EventManager {
381389
listener.callStateChanged(state);
382390
});
383391
}
392+
393+
void _notifyNewMessageListeners(SIPMessageRequest msg) {
394+
_sipUaHelperListeners.forEach((listener) {
395+
listener.onNewMessage(msg);
396+
});
397+
}
384398
}
385399

386400
enum CallStateEnum {
@@ -443,10 +457,19 @@ class TransportState {
443457
TransportState(this.state, {this.cause});
444458
}
445459

460+
class SIPMessageRequest {
461+
dynamic request;
462+
String originator;
463+
Message message;
464+
SIPMessageRequest(this.message, this.originator, this.request);
465+
}
466+
446467
abstract class SipUaHelperListener {
447468
void transportStateChanged(TransportState state);
448469
void registrationStateChanged(RegistrationState state);
449470
void callStateChanged(CallState state);
471+
//For SIP new messaga coming
472+
void onNewMessage(SIPMessageRequest msg);
450473
}
451474

452475
class UaSettings {

0 commit comments

Comments
 (0)