/src/mozilla-central/media/webrtc/signaling/src/sdp/SipccSdpParser.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | | /* vim: set ts=2 et sw=2 tw=80: */ |
3 | | /* This Source Code Form is subject to the terms of the Mozilla Public |
4 | | * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
5 | | * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
6 | | |
7 | | #include "signaling/src/sdp/SipccSdpParser.h" |
8 | | #include "signaling/src/sdp/SipccSdp.h" |
9 | | |
10 | | #include <utility> |
11 | | extern "C" { |
12 | | #include "signaling/src/sdp/sipcc/sdp.h" |
13 | | } |
14 | | |
15 | | namespace mozilla |
16 | | { |
17 | | |
18 | | extern "C" { |
19 | | |
20 | | void |
21 | | sipcc_sdp_parser_error_handler(void *context, uint32_t line, |
22 | | const char *message) |
23 | 450k | { |
24 | 450k | SdpErrorHolder *errorHolder = static_cast<SdpErrorHolder *>(context); |
25 | 450k | std::string err(message); |
26 | 450k | errorHolder->AddParseError(line, err); |
27 | 450k | } |
28 | | |
29 | | } // extern "C" |
30 | | |
31 | | UniquePtr<Sdp> |
32 | | SipccSdpParser::Parse(const std::string &sdpText) |
33 | 9.73k | { |
34 | 9.73k | ClearParseErrors(); |
35 | 9.73k | |
36 | 9.73k | sdp_conf_options_t *sipcc_config = sdp_init_config(); |
37 | 9.73k | if (!sipcc_config) { |
38 | 0 | return UniquePtr<Sdp>(); |
39 | 0 | } |
40 | 9.73k | |
41 | 9.73k | sdp_nettype_supported(sipcc_config, SDP_NT_INTERNET, true); |
42 | 9.73k | sdp_addrtype_supported(sipcc_config, SDP_AT_IP4, true); |
43 | 9.73k | sdp_addrtype_supported(sipcc_config, SDP_AT_IP6, true); |
44 | 9.73k | sdp_transport_supported(sipcc_config, SDP_TRANSPORT_RTPAVP, true); |
45 | 9.73k | sdp_transport_supported(sipcc_config, SDP_TRANSPORT_RTPAVPF, true); |
46 | 9.73k | sdp_transport_supported(sipcc_config, SDP_TRANSPORT_RTPSAVP, true); |
47 | 9.73k | sdp_transport_supported(sipcc_config, SDP_TRANSPORT_RTPSAVPF, true); |
48 | 9.73k | sdp_transport_supported(sipcc_config, SDP_TRANSPORT_UDPTLSRTPSAVP, true); |
49 | 9.73k | sdp_transport_supported(sipcc_config, SDP_TRANSPORT_UDPTLSRTPSAVPF, true); |
50 | 9.73k | sdp_transport_supported(sipcc_config, SDP_TRANSPORT_TCPTLSRTPSAVP, true); |
51 | 9.73k | sdp_transport_supported(sipcc_config, SDP_TRANSPORT_TCPTLSRTPSAVPF, true); |
52 | 9.73k | sdp_transport_supported(sipcc_config, SDP_TRANSPORT_DTLSSCTP, true); |
53 | 9.73k | sdp_transport_supported(sipcc_config, SDP_TRANSPORT_UDPDTLSSCTP, true); |
54 | 9.73k | sdp_transport_supported(sipcc_config, SDP_TRANSPORT_TCPDTLSSCTP, true); |
55 | 9.73k | sdp_require_session_name(sipcc_config, false); |
56 | 9.73k | |
57 | 9.73k | sdp_config_set_error_handler(sipcc_config, &sipcc_sdp_parser_error_handler, |
58 | 9.73k | this); |
59 | 9.73k | |
60 | 9.73k | // Takes ownership of |sipcc_config| iff it succeeds |
61 | 9.73k | sdp_t *sdp = sdp_init_description(sipcc_config); |
62 | 9.73k | if (!sdp) { |
63 | 0 | sdp_free_config(sipcc_config); |
64 | 0 | return UniquePtr<Sdp>(); |
65 | 0 | } |
66 | 9.73k | |
67 | 9.73k | const char *rawString = sdpText.c_str(); |
68 | 9.73k | sdp_result_e sdpres = sdp_parse(sdp, rawString, sdpText.length()); |
69 | 9.73k | if (sdpres != SDP_SUCCESS) { |
70 | 7.22k | sdp_free_description(sdp); |
71 | 7.22k | return UniquePtr<Sdp>(); |
72 | 7.22k | } |
73 | 2.51k | |
74 | 2.51k | UniquePtr<SipccSdp> sipccSdp(new SipccSdp); |
75 | 2.51k | |
76 | 2.51k | bool success = sipccSdp->Load(sdp, *this); |
77 | 2.51k | sdp_free_description(sdp); |
78 | 2.51k | if (!success) { |
79 | 566 | return UniquePtr<Sdp>(); |
80 | 566 | } |
81 | 1.94k | |
82 | 1.94k | return UniquePtr<Sdp>(std::move(sipccSdp)); |
83 | 1.94k | } |
84 | | |
85 | | } // namespace mozilla |