1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
using Gee;
using Xmpp;
using Xmpp.Xep;
namespace Xmpp.Xep.JingleRtp {
public enum CallSessionInfo {
ACTIVE,
HOLD,
UNHOLD,
MUTE,
UNMUTE,
RINGING
}
public class SessionInfoType : Jingle.SessionInfoNs, Object {
public const string NS_URI = "urn:xmpp:jingle:apps:rtp:info:1";
public string ns_uri { get { return NS_URI; } }
public signal void info_received(Jingle.Session session, CallSessionInfo info);
public signal void mute_update_received(Jingle.Session session, bool mute, string name);
public void handle_content_session_info(XmppStream stream, Jingle.Session session, StanzaNode info, Iq.Stanza iq) throws Jingle.IqError {
switch (info.name) {
case "active":
info_received(session, CallSessionInfo.ACTIVE);
break;
case "hold":
info_received(session, CallSessionInfo.HOLD);
break;
case "unhold":
info_received(session, CallSessionInfo.UNHOLD);
break;
case "mute":
string? name = info.get_attribute("name");
mute_update_received(session, true, name);
info_received(session, CallSessionInfo.MUTE);
break;
case "unmute":
string? name = info.get_attribute("name");
mute_update_received(session, false, name);
info_received(session, CallSessionInfo.UNMUTE);
break;
case "ringing":
info_received(session, CallSessionInfo.RINGING);
break;
}
}
public void send_mute(Jingle.Session session, bool mute, string media) {
string node_name = mute ? "mute" : "unmute";
foreach (Jingle.Content content in session.contents.values) {
Parameters? parameters = content.content_params as Parameters;
if (parameters != null && parameters.media == media) {
StanzaNode session_info_content = new StanzaNode.build(node_name, NS_URI).add_self_xmlns().put_attribute("name", content.content_name);
session.send_session_info(session_info_content);
}
}
}
public void send_ringing(Jingle.Session session) {
StanzaNode session_info_content = new StanzaNode.build("ringing", NS_URI).add_self_xmlns();
session.send_session_info(session_info_content);
}
}
}
|